Jak vyloučit pole ze serializace v Java?
sobes.tech AI
Odpověď od AI
Existuje několik způsobů, jak vyloučit pole ze serializace:
-
Použití klíčového slova
transient: Nejjednodušší a nejběžnější způsob. Pole označené tímto modifikátorem je ignorováno standardním mechanismem serializace Java.public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Toto pole nebude serializováno public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Gettery a settery } -
Přepsání metod
writeObjectareadObject: Umožňuje plnou kontrolu nad procesem serializace a deserializace, určující, která pole se mají uložit (writeObject) a obnovit (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 vyloučit public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Serializujeme pouze potřebná pole out.defaultWriteObject(); // Serializuje ne-transient, ne-vyloučená pole // Pokud jsou pole označená jako transient, ale která je třeba serializovat, // nebo pole, která je třeba serializovat specifickým způsobem, lze je serializovat ručně zde } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Deserializujeme pouze potřebná pole in.defaultReadObject(); // Deserializuje ne-transient, ne-vyloučená pole // Pokud jsou pole označená jako transient, ale která je třeba deserializovat, // lze je deserializovat ručně zde } // Gettery a settery } -
Použití rozhraní
Externalizable: Poskytuje úplnou kontrolu nad serializací, vyžadující implementaci metodwriteExternalareadExternal. Je to flexibilnější přístup nežSerializable, ale vyžaduje více manuální 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 vyloučit // Veřejný bezparametrický konstruktor je povinný pro Externalizable public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Jasně uvádíme, co serializujeme out.writeObject(fieldToSerialize); // fieldToExclude se neserializuje } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Jasně uvádíme, co deserializujeme fieldToSerialize = (String) in.readObject(); // fieldToExclude se nedeserializuje } // Gettery a settery }
Volba metody závisí na konkrétním úkolu a požadované úrovni kontroly nad procesem serializace. Nejjednodušší pro většinu případů je použití transient.