Menu Content/Inhalt
Startseite arrow Java arrow Serialisierung in Java
Serialisierung in Java Drucken E-Mail

Was ist Serialisierung?

Manchmal braucht man ein Objekt nicht nur so lang, wie ein Programm läuft, sondern auch danach nochmal. Neben Datenbanken gibt es für solche Probleme den Mechanismus des Serialisierens. Beim Serialisieren wird der wird der aktuelle Zustand eines Objekts in eine Datei geschrieben, die jederzeit wieder ausgelesen werden kann. Mit den ausgelesenen Daten kann man sich dann einem neues Objekt anlegen, das wieder genau den Zustand des alten Objekts hat. Das nennt man dann Deserialisieren.

Weil möglicherweise auch aggregierte Objekte den Zustand eines Objektes beschreiben, müssen diese beim Serialisieren auch berücksichtigt werden, also deren Zustand auch mit gespeichert werden. Eine weitere Anwendung der Serialisierung ist, Objekte durch Serialisierung in eine Form zu bringen, in der man sie über ein Netz transportieren kann (zB als Parameter einer Methode bei Socket-Verbindung).

Dadurch, dass auch aggregierte Objekte beim Serialisieren berücksichtigt werden, könnte es normalerweise zu dem unerwünschten Effekt kommen, dass sich der Algorithmus zur Serialisierung in eine Endlosschleife verläuft, wenn zB. zwei Objekte sich gegenseitig aggregieren, oder allgemeiner, wenn es Zyklen bei der Referenzierung gibt. An diesen Fall haben aber schon die Java-Programmierer gedacht. Es wird deshalb beim Serialisieren eine Hash-Tabelle aller Objekt-Referenzen der zu serialisierenden Objekte angelegt, mit der verhindert wird, dass ein Objekt zweimal serialisiert wird.

 

Umsetzung in Java

Zum Serialisieren braucht man folgende Stream-Klassen aus dem Package java.io:

  • ObjectInputStream
  • ObjectOutputStream

Die Konstruktoren der beiden Klassen verlangen als Parameter jeweils einen Grund-Stream von der abstrakten Klasse InputStream, bzw. OutputStream. Die folgenden beiden konkreten Klassen sind Erweiterungen der benötigten abstrakten Klassen und können benutzt werden, wenn man die Objekte in Dateien speichern will.

  • FileInputStream
  • FileOutputStream

Die Klasse, des Objekts, das serialisiert werden soll muss das Interface Serializable implementieren.

 

Methoden der Object-Stream-Klassen

Die write-Methoden

Um Objekte zu serialisieren stellt die Klasse ObjectOutputStream für jeden primitiven Datentyp eine write-Methode bereit. Die Signatur einiger write-Methoden sieht folgendermassen aus:

void writeInt( int wert )

void writeChar( char wert )

void writeChars( String wert ) (für Strings zu serialisieren)

Zu Serialisieren von Objekten gibt es die Methode

void writeObject( Object wert ).

Es wird also jedes Objekt beim Serialisieren auf seine Oberklasse Object gecastet wird. Die write-Methoden werfen alle IOExceptions, die beim Benutzen der Methoden behandelt werden müssen.

 

Die read-Methoden

Die read-Methoden der Klasse ObjectInputStream sind analog zu den o.g. write-Methoden. Sie haben keine Parameter und haben als Rückgabetyp den jeweiligen Datentyp. Einige Beispiele sind:

boolean readBoolean()

int readInt()

Object readObject()

Wenn man ein Objekt wieder deserialisiert ist es vom Typ Object und muss durch einen Down-Cast zurück in seinen ursprünglichen Datentyp gecastet werden. Der genaue Typ des Objekts muss deshalb dem Programmierer bekannt sein, weil das System nur weiss, dass es sich um ein Unterobjekt der Klasse Object handelt.

Die read-Methoden werfen unterschiedliche Exceptions, die abgefangen werden müssen.

 

Java-Code-Beispiele

Serialisierung


  • ein Objekt-Stream wird angelegt als Parameter wird ein Datei-Stream übergeben (20)
  • ein Integer wird serialisiert (22)
  • ein String wird als Objekt serialisiert (23)
  • ein Objekt der Klasse Date wird serialisiert (24)
  • der Datenstrom wird geschlossen (25)



Deserialisierung

  • ein Datei-Stream wird angelegt (27)
  • ein Objekt-Stream wird angelegt (28)
  • ein Integer wird deserialisiert (27)
  • ein String wurde als Objekt serialisiert, wird eingelesen und als String down-gecastet (30)
  • ein Objekt wird eingelesen und auf seinen ursprünglichen Datentyp Date down-gecastet (31)
  • der Objekt-Stream wird geschlossen (32)