| Serialisierung in Java |
|
|
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 JavaZum Serialisieren braucht man folgende Stream-Klassen aus dem Package java.io:
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.
Die Klasse, des Objekts, das serialisiert werden soll muss das Interface Serializable implementieren.
Methoden der Object-Stream-KlassenDie write-MethodenUm Objekte zu serialisieren stellt die Klasse ObjectOutputStream für jeden primitiven Datentyp eine write-Methode bereit. Die Signatur einiger write-Methoden sieht folgendermassen aus:
Zu Serialisieren von Objekten gibt es die Methode
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:
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-BeispieleSerialisierung
|



