როგორ გამოვრიცხოთ ველები სერიულიალიზაციიდან Java-ში?
sobes.tech AI
პასუხი AI-სგან
სერიულიალიზაციისგან გამორიცხვის რამდენიმე გზა არსებობს:
-
საკვანძო სიტყვა
transient-ის გამოყენება: ეს ყველაზე მარტივი და გავრცელებული მეთოდია. ამ ცვლილებით აღნიშნული ველი იგნორირებულია Java-ს სტანდარტული სერიულიალიზაციის მექანიზმის მიერ:public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // ეს ველი არ იქნება სერიულიალიზებული public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // გეტერები და სეტერები } -
writeObjectდაreadObjectმეთოდების გადაწერა: ეს საშუალებას აძლევს სრული კონტროლი სერიულიალიზაციის და დესერიულიალიზაციის პროცესზე, განსაზღვროთ, რომელი ველები უნდა შეინახოს და აღადგინოს:import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyClass implements Serializable { private String fieldToSerialize; private String fieldToExclude; // ეს ველი უნდა გამორიცხოს public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // მხოლოდ საჭირო ველები სერიულიალიზდება out.defaultWriteObject(); // სერიულიალიზება არა-transient, არა გამორიცხული ველებისთვის // თუ არსებობს transient ველები, რომლებსაც სურს სერიულიალიზება, ან ველები, რომლებსაც სურს სპეციფიკური ფორმით სერიულიალიზება, // მათ შეიძლება სერიულიალიზება აქ } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // მხოლოდ საჭირო ველები დესერიულიალიზდება in.defaultReadObject(); // დესერიულიალიზება არა-transient, არა გამორიცხული ველებისთვის // თუ არსებობს transient ველები, რომლებსაც სურს დესერიულიალიზება, // მათ შეიძლება დესერიულიალიზება აქ } // გეტერები და სეტერები } -
Externalizableინტერფეისის გამოყენება: ეს უზრუნველყოფს სრული კონტროლს სერიულიალიზაციის პროცესზე, მოთხოვნის შესაბამისადwriteExternalდაreadExternalმეთოდების რეალიზაციას. ეს უფრო მოქნილი მიდგომაა, ვიდრეSerializable, მაგრამ მოითხოვს მეტი ხელით მართვას:import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; public class MyClass implements Externalizable { private String fieldToSerialize; private String fieldToExclude; // ეს ველი უნდა გამორიცხოს // პუბლიკური არგუმენტების გარეშე კონსტრუქტორი აუცილებელია public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // კონკრეტულად ვანიშნოთ, რომ სერიულიალიზება მოხდეს out.writeObject(fieldToSerialize); // fieldToExclude არ სერიულიალიზდება } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // კონკრეტულად ვანიშნოთ, რომ დესერიულიალიზება მოხდეს fieldToSerialize = (String) in.readObject(); // fieldToExclude არ დესერიულიალიზდება } // გეტერები და სეტერები }
არჩევანი დამოკიდებულია კონკრეტულ დავალებაზე და სერიულიალიზაციის პროცესზე კონტროლის დონეზე. უმარტივესად უმეტეს შემთხვევებში გამოიყენება transient.