Ako vylúčiť polia zo serializácie v Jave?
sobes.tech AI
Odpoveď od AI
Existuje niekoľko spôsobov, ako vylúčiť polia zo serializácie:
-
Použitie kľúčového slova
transient: Najjednoduchší a najbežnejší spôsob. Pole označené týmto modifikátorom je ignorované štandardným mechanizmom serializácie Java.public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Toto pole nebude serializované public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Gettery a settery } -
Prepisovanie metód
writeObjectareadObject: Umožňuje úplnú kontrolu nad procesom serializácie a deserializácie, určujúc, ktoré polia sa majú uložiť (writeObject) a obnoviť (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; // Toto pole chceme vylúčiť public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Serializujeme iba potrebné polia out.defaultWriteObject(); // Serializuje ne-transient, ne-vylúčené polia // Ak existujú polia označené ako transient, ale ktoré je potrebné serializovať, // alebo polia, ktoré je potrebné serializovať špecifickým spôsobom, môžu byť serializované ručne tu } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Deserializujeme iba potrebné polia in.defaultReadObject(); // Deserializuje ne-transient, ne-vylúčené polia // Ak existujú polia označené ako transient, ale ktoré je potrebné deserializovať, // môžu byť deserializované ručne tu } // Gettery a settery } -
Použitie rozhrania
Externalizable: Poskytuje úplnú kontrolu nad serializáciou, vyžadujúc implementáciu metódwriteExternalareadExternal. Je to flexibilnejší prístup akoSerializable, ale vyžaduje viac manuálnej práce.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; // Toto pole chceme vylúčiť // Verejný bezparametrický konštruktor je povinný pre Externalizable public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Jasne uvádzame, čo serializujeme out.writeObject(fieldToSerialize); // fieldToExclude sa neserializuje } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Jasne uvádzame, čo deserializujeme fieldToSerialize = (String) in.readObject(); // fieldToExclude sa nedeserializuje } // Gettery a settery }
Výber metódy závisí od konkrétneho úlohy a požadovanej úrovne kontroly nad procesom serializácie. Najjednoduchším pre väčšinu prípadov je použitie transient.