Kuidas välistada väljad Java serialiseerimisel?
sobes.tech AI
Vastus AI-lt
On mitmeid viise, kuidas välistada väljad serialiseerimisest:
-
Kasutades võtmesõna
transient: See on kõige lihtsam ja levinum viis. Selle märgisega märgitud väli ignoreeritakse Java standardse serialiseerimismehhanismi poolt:public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // See väli ei serialiseerita public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Getterid ja setterid } -
writeObjectjareadObjectmeetodite üle kirjutamine: See võimaldab täielikult kontrollida serialiseerimis- ja deserialiseerimisprotsessi, määrates, millised väljad salvestada ja taastada: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; // Selle välja tahame välja jätta public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Salvestame ainult vajalikud väljad out.defaultWriteObject(); // Salvestab mitte-transient, mitte välja jäetud väljad // Kui on transient väljad, mida soovite salvestada, või väljad, mida tuleb spetsiifiliselt serialiseerida, saab neid siin serialiseerida } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Taastame ainult vajalikud väljad in.defaultReadObject(); // Taastab mitte-transient, mitte välja jäetud väljad // Kui on transient väljad, mida tuleb deserialiseerida, saab neid siin deserialiseerida } // Getterid ja setterid } -
Kasutades
Externalizableliidest: See annab täieliku kontrolli serialiseerimise üle, nõudeswriteExternaljareadExternalmeetodite realiseerimist. See on paindlikum lähenemine kuiSerializable, kuid nõuab rohkem käsitsi juhtimist: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; // Selle välja tahame välja jätta // Nõutav avalik konstruktor ilma argumentideta public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Selgelt näitame, mida serialiseerida out.writeObject(fieldToSerialize); // fieldToExclude ei serialiseerita } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Selgelt näitame, mida deserialiseerida fieldToSerialize = (String) in.readObject(); // fieldToExclude ei deserialiseerita } // Getterid ja setterid }
Valik sõltub konkreetse ülesande ja serialiseerimisprotsessi kontrolli tasemest. Enamikul juhtudel on kõige lihtsam kasutada transient.