Sobes.tech
Junior

Kaip išskirti laukus iš serializacijos Java?

sobes.tech AI

Atsakymas iš AI

Yra keletas būdų išskirti laukus iš serializacijos:

  1. Naudojant raktinį žodį transient: Tai yra paprasčiausias ir dažniausiai naudojamas būdas. Šiuo žodžiu pažymėtas laukas bus ignoruojamas Java standartinės serializacijos mechanizmo:

    public class MyClass implements java.io.Serializable {
        private String essentialField;
        private transient String secretField; // Šis laukas nebus serializuotas
    
        public MyClass(String essentialField, String secretField) {
            this.essentialField = essentialField;
            this.secretField = secretField;
        }
    
        // Ggetteriai ir sgetteriai
    }
    
  2. Perrašyti writeObject ir readObject metodus: Tai leidžia visiškai kontroliuoti serializacijos ir deserializacijos procesą, nustatant, kuriuos laukus išsaugoti ir atkurti:

    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; // Šį lauką norime išskirti
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // Saugome tik reikalingus laukus
            out.defaultWriteObject(); // Saugia ne-transient, ne išskirtus laukus
            // Jei yra transient laukai, kuriuos norite išsaugoti, arba laukus, kuriuos reikia serializuoti ypatingu būdu, juos galima serializuoti čia
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            // Atkuriame tik reikalingus laukus
            in.defaultReadObject(); // Atkuriami ne-transient, ne išskirti laukus
            // Jei yra transient laukų, kuriuos reikia atkurti, juos galima atkurti čia
        }
    
        // Ggetteriai ir sgetteriai
    }
    
  3. Naudoti Externalizable sąsają: Tai suteikia pilną kontrolę serializacijai, reikalaujant įgyvendinti writeExternal ir readExternal metodus. Tai lankstesnis požiūris nei Serializable, bet reikalauja daugiau rankinio valdymo:

    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; // Šį lauką norime išskirti
    
        // Būtinas viešas be parametrų konstruktorius
        public MyClass() {
        }
    
        public MyClass(String fieldToSerialize, String fieldToExclude) {
            this.fieldToSerialize = fieldToSerialize;
            this.fieldToExclude = fieldToExclude;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            // Aiškiai nurodome, ką serializuoti
            out.writeObject(fieldToSerialize);
            // fieldToExclude nėra serializuojamas
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            // Aiškiai nurodome, ką deserializuoti
            fieldToSerialize = (String) in.readObject();
            // fieldToExclude nėra deserializuojamas
        }
    
        // Ggetteriai ir sgetteriai
    }
    

Pasirinkimas priklauso nuo konkrečios užduoties ir norimo kontroliuoti serializacijos proceso lygio. Daugeliu atvejų paprasčiausias būdas yra naudoti transient.