Axel Rogat
Objektorientiertes Programmieren mit C++ und JAVA
 
27.5: Datenkompression Kapitel 27 28: JAVA im Netz 
 
  27.6 Serialisierung  
 

Dieser in JAVA 1.1 eingeführte Mechanismus dient zum Schreiben und Laden kompletter Objekte in/aus Dateien ("Serialisieren" und "Deserialisieren"). Es werden alle Member abgespeichert, auch private und solche, die aus Oberklassen geerbt wurden. Wenn ein Objekt andere Objekte referenziert, werden auch diese automatisch mit abgespeichert (rekursive Serialisierung). Daher stammt der Name: alle zusammengehörigen Daten (ein ganzer Objekt-/Unterobjekt-Baum) werden serialisiert, um in die sequentielle Struktur einer Datei zu passen.

Objekte müssen also nicht bei jeder I/O-Operation explizit in ihre Bestandteile (letztendlich primitive Typen) zerlegt und ein passendes Dateiformat entworfen zu werden. Programmen, die mit Grafiken und Textdarstellungen arbeiten, erhalten so automatisch ein Ein-/Ausgabe-Format, das nicht ausdrücklich programmiert zu werden braucht. Applets können durch Deserialisierung in den Viewer oder Browser geladen werden. Außerdem kann die Serialisierung problemlos mit Zip-Streams gekoppelt werden.

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants { public ObjectInputStream(InputStream in) throws IOException, StreamCorruptedException; public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException; } public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants { public ObjectOutputStream(OutputStream out) throws IOException; public final void writeObject(Object obj) throws IOException; }
public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }

Beispiel: Wir serialisieren einen Vektor aus Strings mit einem Befehl. Die erste Funktion schreibt den Vektor in eine Datei, die zweite restauriert den Vektor aus dieser Datei und gibt ihn aus.

static void toDisk() { Vector v=new Vector(10); v.addElement("A Midsummer-Night's Dream"); v.addElement("Much Ado about Nothing"); v.addElement("The Comedy of Errors"); v.addElement("The Merry Wives of Windsor"); v.addElement("The Taming of the Shrew"); try { new ObjectOutputStream( new FileOutputStream("vector.ser")).writeObject(v); } catch (Exception e) { System.err.println("sorry: "+e); } } static void fromDisk() { try { Vector v=(Vector)new ObjectInputStream( new FileInputStream("vector.ser")).readObject(); System.out.println(v); } catch (Exception e) { System.err.println("sorry: "+e); } }
Die erzeugte Datei vector.ser sieht wie folgt aus (nicht druckbare Zeichen durch . ersetzt):
....sr..java.util.Vector..[.;.....I..capacityIncrementI..elemen tCount[..elementDatat..[Ljava/lang/Object;xp........ur..[Ljava.l ang.Object;..X..s)l...xp....t..A Midsummer-Night's Dreamt Much Ado about Nothingt The Comedy of Errorst The Merry Wives of Wi ndsort The Taming of the Shrewppppp
Man erkennt beispielsweise den Namen der serialisierten Klasse Vector und die Namen ihrer Daten-Member.

Auch Applets können serialisiert werden. Dabei ist zu beachten, daß sie vor dem Abspeichern gestoppt werden müssen. Sie können dann auf spezielle Weise in den Browser geladen werden. Nach dem Laden müssen sie neu gestartet werden, was die Browser üblicherweise automatisch tun.

 
27.5: Datenkompression Startseite 28: JAVA im Netz 
 

© 1998 Axel Rogat