Wie schließt man Felder aus der Serialisierung in Java aus?
sobes.tech KI
Antwort von AI
Es gibt mehrere Möglichkeiten, Felder aus der Serialisierung auszuschließen:
-
Verwendung des Schlüsselworts
transient: Die einfachste und gebräuchlichste Methode. Ein mit diesem Modifikator versehenes Feld wird vom standardmäßigen Serialisierungsmechanismus von Java ignoriert.public class MyClass implements java.io.Serializable { private String essentialField; private transient String secretField; // Dieses Feld wird nicht serialisiert public MyClass(String essentialField, String secretField) { this.essentialField = essentialField; this.secretField = secretField; } // Getter und Setter } -
Überschreiben der Methoden
writeObjectundreadObject: Ermöglicht die vollständige Kontrolle über den Serialisierungs- und Deserialisierungsprozess, indem festgelegt wird, welche Felder gespeichert (inwriteObject) und wiederhergestellt (inreadObject) werden.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; // Dieses Feld möchten wir ausschließen public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } private void writeObject(ObjectOutputStream out) throws IOException { // Nur die benötigten Felder serialisieren out.defaultWriteObject(); // Serialisiert nicht-transiente und nicht manuell ausgeschlossene Felder // Falls es Felder gibt, die als transient markiert sind, aber serialisiert werden sollen, // oder Felder, die auf spezielle Weise serialisiert werden sollen, // können diese hier manuell serialisiert werden } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Nur die benötigten Felder deserialisieren in.defaultReadObject(); // Deserialisiert nicht-transiente und nicht manuell ausgeschlossene Felder // Falls es Felder gibt, die als transient markiert sind, aber deserialisiert werden sollen, // können diese hier manuell deserialisiert werden } // Getter und Setter } -
Verwendung der Schnittstelle
Externalizable: Bietet vollständige Kontrolle über die Serialisierung, erfordert die Implementierung der MethodenwriteExternalundreadExternal. Dies ist ein flexiblerer Ansatz alsSerializable, erfordert jedoch mehr manuelle Steuerung.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; // Dieses Feld möchten wir ausschließen // Öffentlicher Konstruktor ohne Argumente, erforderlich für Externalizable public MyClass() { } public MyClass(String fieldToSerialize, String fieldToExclude) { this.fieldToSerialize = fieldToSerialize; this.fieldToExclude = fieldToExclude; } @Override public void writeExternal(ObjectOutput out) throws IOException { // Explizit angeben, was serialisiert wird out.writeObject(fieldToSerialize); // fieldToExclude wird nicht serialisiert } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // Explizit angeben, was deserialisiert wird fieldToSerialize = (String) in.readObject(); // fieldToExclude wird nicht deserialisiert } // Getter und Setter }
Die Wahl der Methode hängt von der konkreten Aufgabe und dem gewünschten Kontrollniveau über den Serialisierungsprozess ab. Für die meisten Fälle ist die Verwendung von transient am einfachsten.