Serialisierung

Serialisierung: Objektzustände speichern 


Bei der Benutzung andere Programme werden Objektzustände in einer einfachen Textdatei gespeichert. Bei der Benutzung eines Java-Programms ist dies auch durch das Konzept der Serialisierung möglich.

Serialisierung beschreibt also die Speicherung von Objektzuständen in Dateien und wird für die Übertragung von Objekten über das Netzwerk bei verteilten Softwaresystemen verwendet.

Anschlussströme, auch „Low-level“-Strom, können sich mit einer Datei oder anderen Quelle/ Zielort verbinden und schreiben Bytes in eine Datei.

Verkettungsströme, auch „High-level“-Strom, können sich nicht mit Dateien verbinden und benötigen daher Anschlussströme. Der Stream wandelt Objekte in Daten um, die in einen Strom geschrieben werden können.


FileOutputStream erzeugen: schreibt Bytes in eine Datei (Anschlussstrom) und kann sich mit einer Datei verbinden:

FileOutputStream fileStream = new FileOutputStream(“MeinSpiel.ser”);

ObjectOutputStream erzeugen: Es können Objekte geschrieben werden, aber man kann sich nicht direkt mit einer Datei verbinden. (Verkettungsstrom):

ObjectOutputStream os = new ObjectOutputStream(fileStream);

Object schreiben: figurx referenziertes Objekt wird serialisiert und in die Datei „MeinSpiel.ser“ geschrieben:

os.writeObject(figur1);
os.writeObject(figur2);

os.writeObject(figur3);

ObjectOutputStream schließen:

os.close();

Serialization

Zusammengefasst:

  • Datei ist dabei der Zielort.
  • FileOutputStream = Anschlussströme: Verbindung zu einer Quelle oder einem Zielort
  • ObjectOutputStream = Verkettungsströme: müssen mit einem Anschlussstrom verkettet werden

Wie funktioniert das genau?

Auf dem Heap unterscheiden sich Instanzen der gleichen Klasse lediglich durch ihren Zustand, also den Wert der Instanzvariablen. Serialisierte Objekte speichern die Werte der Instanzvariablen, so dass ein identisches Objekt auf dem Heap erzeugt werden kann. Instanzvariablen, die Objekte referenzieren, werden automatisch serialisiert, wenn das Objekt selbst serialisiert wird. Der vollständige Objektgraph wird gespeichert. Serializable macht die Klasse serialisierbar. Transient markiert Objektvariablen, die beim Serialisierungsvorgang übersprungen werden sollen, also nicht gespeichert werden sollen. Nicht gespeichert werden können Netzwerkverbindungen, Thread, Dateiobjekte, da sie laufzeitspezifisch sind.

 


Deserialisierung: Wiederherstellung von Objektzuständen 

Deserialisierung ist genau das Gegenteil der Serialisierung und eine Methode, um zuvor gespeicherte Zustände wiederherzustellen. Dazu wird zunächst ein neues Objekt auf dem Heap erzeugt, welches dann den gespeicherten Zustand annimmt.


FileInputStream (Anschlusstrom) erzeugen, der die Verbindung zur Quelldatei herstellen kann:

FileInputStream fileStream = new FileInputStream(„MeinSpiel.ser”);

ObjectInputStream erzeugen: kann Objekte lesen, können aber keine direkte Verbindung zu einer Datei herstellen.

ObjectInputStream os = new ObjectInputStream(fileStream);

Objekt lesen:

Object eins = os.readObject();
Object zwei = os.readObject();
Object drei = os.readObject();

Object casten: Der Rückgabewert Object() ist vom Typ Object, deswegen muss ein Cast auf den eigentlichen Typ durchgeführt werden.

Spielfigur elb = (Spielfigur) eins;
Spielfigur troll = (Spielfigur) zwei;
Spielfigut zauberer = (Spielfigur) drei;

ObjectInputStream schließen: Wenn man den obersten Strom schließt, werden auch alle nachfolgenden Ströme geschlossen:

os.close();

Deserialization

Wie funktioniert das genau? 

  • Das Objekt wird aus dem Strom gelesen.
  • JVM bestimmt die Klasse des Objekts.
  • JVM findet die Klasse und lädt sie, andernfalls wird eine Exception ausgelöst.
  • Für das neue Objekt wird Speicherplatz auf dem Heap reserviert, aber der Konstruktor des serialisierten Objektes wird nicht ausgeführt, da der letzte Zustand wiederhergestellt und nicht ein komplett neues Objekt erzeugt werden soll.
  • Ein Konstruktor für eine nicht serialisierte Klasse wird ausgeführt. Alle Superklassen ab der ersten nicht serialisierbaren werden so reinitialisiert.
  • Die Objektvariablen des Objektes erhalten ihre letzten Werte und damit den Zustand bevor die serialisiert wurden (außer transient Variablen).

Zusammengefasst:

  • Datei ist dabei die Quelle.
  • FileInputStream = Anschlussströme: Verbindung zu einer Quelle oder einem Zielort
  • ObjectInputStream = Verkettungsströme: müssen mit einem Anschlussstrom verkettet werden

Alternative: Textdatei

Die Alternative zu einem serialisierten Objekt ist die Erstellung einer String- Datei.

Dazu muss zuerst das Paket java.io für den Filewriter installiert werden. Es beinhaltet die Methoden write und close. Anschließend muss ein Try-Catch-Blocke erstellt werden, welcher die Filewriter-Datei erzeugen soll. Die Methode übernimmt den Text, der in die Datei geschrieben werden soll.

Erstelle eine Website wie diese mit WordPress.com
Jetzt starten