Kaip išskirti laukus iš serializacijos Java?
sobes.tech AI
Atsakymas iš AI
Yra keletas būdų išskirti laukus iš serializacijos:
-
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 } -
Perrašyti
writeObjectirreadObjectmetodus: 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 } -
Naudoti
Externalizablesąsają: Tai suteikia pilną kontrolę serializacijai, reikalaujant įgyvendintiwriteExternalirreadExternalmetodus. Tai lankstesnis požiūris neiSerializable, 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.