Java SE 8 Standard-Bibliothek – Datenströme

Java SE 8 Standard-Bibliothek – Datenströme

Objekte sind beim Beenden der virtuellen Maschine nicht automatisch persistiert. Um ihre Struktur zu erhalten, kann die Standardbibliothek von Java SE 8 genutzt werden. Diese bietet verschiedene Ansätze, um Objekte automatisch persistieren und speichern zu können.

Persistente Objekte und Serialisierung

Um Objekte persistent zu machen und später wiederherzustellen, gibt es einen Mechanismus, der die Objektstruktur und Variablenbelegung zu einer bestimmten Zeit sicher (persistent) macht und an anderer Stelle wieder hervorholt und die Objektstruktur und Variablenbelegung restauriert. Dabei müssen alle Informationen wie der Objekttyp und der Variablentyp gespeichert werden, um das richtige Wiederherstellen zu ermöglichen. Auch Unterobjekte müssen gesichert werden, da sie von den betrachtenden Stellen aus erreichbar sind. Rekursiv wird ein Objektbaum durchlaufen, um eine vollständige Datenstruktur zu erhalten. Dabei wird auch der doppelte Zugriff auf ein Objekt berücksichtigt und zyklische Abhängigkeiten werden beachtet.

Die Standardserialisierung ist eine Möglichkeit, Objekte automatisch persistent abzubilden. Dabei werden die Objektstruktur und Zustände in einem binären Format gesichert. Die Standardserialisierung ist besonders wichtig für entfernte Methodenaufrufe, weniger aber für das langfristige Abspeichern von Daten.

Objekte mit der Standardserialisierung speichern und lesen

Um Objekte mit der Standardserialisierung zu speichern, werden die Objektzustände in einen Byte-Strom geschrieben. Dabei wird der Klasse ObjectOutputStream und der Methode writeObject(Object) verwendet. Bei der Deserialisierung wird der Klasse ObjectInputStream und der Methode readObject() verwendet. Es ist wichtig zu beachten, dass während des Lesens die Klasseninformationen zur Laufzeit vorhanden sein müssen.

LESEN  Stagepiano oder Homepiano: Wo liegen die Unterschiede?

Die Schnittstelle Serializable

Damit Objekte serialisiert werden können, müssen die entsprechenden Klassen die Schnittstelle Serializable implementieren. Diese Schnittstelle enthält keine Methoden und dient nur als Markierung. Nicht alle Klassen sind serialisierbar, da nicht klar ist, wie zum Beispiel ein Thread oder ein Socket serialisiert werden sollte.

Nicht serialisierbare Attribute aussparen

Um nicht serialisierbare Attribute auszusparen, können entweder das Schlüsselwort “transient” verwendet werden oder das Feld “serialPersistentFields”. Das Feld “serialPersistentFields” kann genutzt werden, um nur die aufgezählten Attribute zu serialisieren.

Das Abspeichern selbst in die Hand nehmen

Es ist möglich, die Serialisierung selbst zu kontrollieren und die Standardserialisierung zu umgehen. Dazu müssen private Methoden writeObject(ObjectOutputStream) und readObject(ObjectInputStream) implementiert werden. Diese Methoden sind für das Schreiben und Lesen der Objekte verantwortlich.

Tiefe Objektkopien

Durch Implementieren der Markierungsschnittstelle Serializable und Überschreiben der clone()-Methode von Object können tiefe Kopien von Objekten erstellt werden. Dabei werden auch die referenzierten Objekte kopiert.

Versionenverwaltung und die SUID

Bei der Serialisierung wird eine eindeutige Kennung der Klasse, die SUID, mitgespeichert. Ändern sich die Attribute oder kommen Attribute hinzu, ändert sich auch die SUID. Klassen mit unterschiedlicher SUID sind nicht kompatibel. Um Kompatibilität sicherzustellen, kann eine eigene SUID verwendet werden.

Probleme mit der Serialisierung

Die Standardserialisierung hat einige Nachteile. Für Nicht-Java-Programme ist eine Weiterverarbeitung schwierig, da die Serialisierung in Binärdaten erfolgt. Zudem ist die Skalierbarkeit problematisch, da bei Änderungen an einer großen Objektstruktur das gesamte Objekt erneut geschrieben werden muss. Parallele Änderungen können zu Problemen führen, da die Serialisierung keinen transaktionalen Schutz bietet.