Die Serialisierung ist ein Mechanismus zur Umwandlung eines Objekts in einen Byte-Stream zur anschließenden Speicherung oder Übertragung. In Java wurde die Serialisierung mit der Plattform in Version 1.1 als Teil der API eingeführt, bedingt durch die Popularität verteilter Anwendungen und die Notwendigkeit des Datenaustauschs zwischen ihnen. Diese Lösung ermöglichte es, die Übertragung komplexer Objektgraphen zwischen JVMs zu vereinfachen und deren Zustand transparent für die Entwickler zu speichern.
Das Problem der Serialisierung besteht darin, dass die Datenintegrität strikt gewahrt werden muss, die Klassenversionierung unterstützt werden muss und komplexe Strukturen (z. B. Graphen mit zyklischen Verweisen) korrekt behandelt werden müssen. Nicht alle Objekte sind serialisierbar (z. B. Streams, Sockets, Betriebssystemressourcen), und die Serialisierung erfordert besondere Aufmerksamkeit für die Sicherheit.
Die Lösung wird durch das Interface Serializable umgesetzt:
import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient int age; // wird nicht serialisiert public Person(String name, int age) { this.name = name; this.age = age; } }
Mit ObjectOutputStream und ObjectInputStream kann das Objekt in eine Datei geschrieben und wiederhergestellt werden:
Person p = new Person("Alice", 30); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); oos.writeObject(p); // Serialisierung ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person restored = (Person) ois.readObject();
Schlüsselfunktionen:
Serializable implementieren.transient werden nicht serialisiert.Kann man ein Objekt mit einem nicht serialisierbaren Feld serialisieren, auch wenn es nicht verwendet wird?
Antwort: Wenn das Feld als transient markiert ist, wird es überhaupt nicht serialisiert, und der Prozess endet nicht mit einer Ausnahme, auch wenn sein Typ Serializable nicht implementiert. Wenn das Feld nicht serialisierbar und nicht transient ist, wird eine NotSerializableException ausgelöst.
Sind statische Felder serialisierbar, wenn die Klasse Serializable implementiert?
Antwort: Nein, statische Felder werden nicht serialisiert, da sie zur Klasse und nicht zu einer Instanz gehören. Nur der Zustand der Instanz wird gespeichert.
Was passiert, wenn die Struktur der Klasse nach der Serialisierung geändert wird (z. B. ein Feld hinzugefügt oder entfernt)?
Antwort: Wenn eine versionierte serialVersionUID angegeben wird und die Struktur inkompatibel geändert wurde, tritt bei der Deserialisierung eine InvalidClassException auf. Zur Gewährleistung der Kompatibilität werden Serialisierungs-Hinweise und eine manuelle Verwaltung von serialVersionUID verwendet.
serialVersionUID und Erhalt von Fehlern aufgrund inkompatibler Klassenversionentransient, was zu einer Leckage sensibler Daten führen kannDie Ingenieure versuchten, ein Objekt zu serialisieren, ohne serialVersionUID hinzuzufügen und ohne die Felder, die auf Betriebssystemressourcen verweisen, als transient zu deklarieren. Nach dem Update der Anwendung und der Klasse trat eine InvalidClassException auf, und das Objekt verlor seine Integrität; die Deserialisierung funktionierte nicht mehr.
Vorteile:
Nachteile:
Für die Serialisierung wurde eine tragbare Klasse mit explizitem serialVersionUID implementiert, alle Ressourcenfelder wurden als transient deklariert, und eine manuelle Serialisierung überwachte die Schlüsselpunkte.
Vorteile:
Nachteile: