Sobes.tech
Junior

როგორ გამოვრიცხოთ ველები სერიულიალიზაციიდან Java-ში?

sobes.tech AI

პასუხი AI-სგან

სერიულიალიზაციისგან გამორიცხვის რამდენიმე გზა არსებობს:

  1. საკვანძო სიტყვა 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;
        }
    
        // გეტერები და სეტერები
    }
    
  2. 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 ველები, რომლებსაც სურს დესერიულიალიზება, 
            // მათ შეიძლება დესერიულიალიზება აქ
        }
    
        // გეტერები და სეტერები
    }
    
  3. 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.