Sobes.tech
Junior

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:

  1. 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
    }
    
  2. Überschreiben der Methoden writeObject und readObject: Ermöglicht die vollständige Kontrolle über den Serialisierungs- und Deserialisierungsprozess, indem festgelegt wird, welche Felder gespeichert (in writeObject) und wiederhergestellt (in readObject) 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
    }
    
  3. Verwendung der Schnittstelle Externalizable: Bietet vollständige Kontrolle über die Serialisierung, erfordert die Implementierung der Methoden writeExternal und readExternal. Dies ist ein flexiblerer Ansatz als Serializable, 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.