Java Serialisierung und persistente Objekte

Java bietet mit der Objektserialisierung die Möglichkeit, Objekte auch ohne Datenbank zu persistieren. So sind diese auch nach dem Beenden einer Anwendung bei dem nächsten Aufruf wieder verfügbar. Die Serialisierung wird nicht nur zum speichern gewünschter Objekte verwendet, sondern ist in der Netzwerkkommunikation (RMI – Remote Methode Invocation) ein wichtiger Bestandteil.
Für die Persistierung der Datenobjekte gibt es in Java verschiedene Ansätze:

  • Standardserialisierung (JSO – Java Object Serialization)
  • Serialisierung in XML (nur mit JavaBeans möglich)
  • Datenbanken (z.B. MySQL, MSSQL, HyperSQL,..)


[ad#co-3]

Bei der Standardserialisierung werden die Objektzustände in einen Bytestrom geschrieben und in einer Datei (in der Regel hat diese die Endung .ser) abgelegt. Aus der gespeicherten Datei können anschließend die Objekte beliebig wieder ausgelesen (Deserialisierung) werden.

Vorbereitung

  • Neues Projekt erstellen: de.michel.persistierung.serialisierung
  • Paket erstellen: serialisierung
  • Writer.java erstellen
  • Reader.java erstellen

Writer.java

In der Writer.java Klasse wird ein serialisiertes Objekt erzeugt indem ein String sowie ein Datum gespeichert wird.

package serialisierung;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Date;

public class Writer
{

	public static void main(String[] args)
	{
		OutputStream outputStream = null;
		try
		{
			// Byteorientierten Ausgabekanal Öffnen
			outputStream = new FileOutputStream("data.ser");

			// Objektausgabekanal für Serialisierung Öffnen
			ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);

			// Objekte serialisiert in Datei ausgeben
			objectOutput.writeObject("Java ist die Zukunft!");
			objectOutput.writeObject(new Date());

			// Ausgabekanal schließen
			objectOutput.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		} finally
		{
			try
			{
				outputStream.close();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

Nachdem die Klasse Writer.java einmal ausgeführt wurde, ist eine neue Datei mit dem Namen data.ser erstellt (i.d.R. muss in Eclipse das Projekt einmal mit F5 aktualisiert werden damit es sichtbar wird) worden, indem sich nun die zwei serialisierten Objekte (String-Objekt, Date-Objekt) befinden.
Um diese anschließend aus der data.ser Datei auszulesen (deserialisieren), wird eine weitere Klasse benötigt. Reader.java gibt die Objekte der serialisierten Datei in der Konsole aus.

[ad#co-3]

Reader.java

package serialisierung;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Reader
{

	public static void main(String[] args)
	{
		try
		{
			// Serialisiertes Objekt
			FileInputStream inputStream = new FileInputStream("data.ser");
			// Deserialisierung
			ObjectInputStream objectInput = new ObjectInputStream(inputStream);
			// String auslesen
			String text = (String) objectInput.readObject();
			// Datum auslesen
			Date date = (Date) objectInput.readObject();
			// Datumsformatierer
			DateFormat formatter = new SimpleDateFormat(); 
			
			System.out.println(text);
			System.out.println("Diese Datei wurde erstellt am: " + formatter.format(date));
		} catch (IOException e)
		{
			e.printStackTrace();
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
	}
}

Ergebnis

In der Eclipse Ausgabekonsole erhalten wir folgendes Resultat:

Java ist die Zukunft!
Diese Datei wurde erstellt am: 03.11.10 19:04