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
Hi schöne Anleitung. Aber fehlt nicht der Vollständigkeit halber die Deserialisierung?
Und vor allem bei Themen wie Serialisierung wären Bilder sehr vorteilhaft. Ganz gut kann man das ja erklären am Beispiel eines aufblasbaren Objekts. Und bei der Serialisierung wurde quasi die Luft rausgelassen.
Ansonsten schönes Beispiel.
Grüße
Hallo kwoxer,
die Deserialisierung findet in der Reader.java Klasse statt. Mit Hilfe von „ObjectInputStream“ können aus der Datei die Objekte wieder gelesen werden. In dem Beispiel war dies zum Beispiel der String sowie das Date-Objekt.
Es macht keinen Unterschied, ob du ein Date-Objekt oder ein selbstgeschriebenes Objekt serialisierst / deserialisierst.
Wenn die Nachfrage da ist, kann ich das Tutorial noch etwas erweitern.
Schöne Grüße
Einzige Erklärung über Serialisierung, die ich richtig verstanden habe! Danke!
Hallo, finde die Anleitung gar nicht schlecht allerdings ist es für mein Problem doch etwas klein gehalten. Ich hab schon viel im Netz gesucht aber man findet immer nur so Minibeispiele. Wie ist das mit größeren Projekten? Muss man jedes Objekt jeder Klasse per writeObject() in die Datei schreiben? Oder reicht es die Hauptklasse zu serialisieren wenn in der neue Objekte von den anderen Klassen angelegt werden?
Würde mich über Antworten freuen. Kontakt per Mail ist ebenfalls möglich =) Danke.
Hallo Final-Fantasy,
grundsätzlich ist es natürlich schwierig gewisse Themen in einem ausreichen komplexen Beispiel zu erstellen. Oft sprengt dies unnötig den Rahmen weshalb du oft im Netz (wie auch hier) lediglich Ansätze findest du wie das Serialisieren grundsätzlich angehen könntest.
Bei größeren Projekten würde ich darüber nachdenken, die Objekte in eine Datenbank zu speichern (Stichwort: Hibernate), sonst wirst du früher oder später den Überblick verlieren.
Es ist ein Studiums Projekt…und zwar ein 4-gewinnt Spiel…dafür braucht man keine Datenbank denk ich mal^^ trotzdem soll Speichern/Laden realisiert werden…nur ist das nicht so einfach wie man denkt^^ ich geb zu ich hab nicht ordentlich aufgepasst als Serialisierung dran war…allerdings war das auch nicht mehr als so Babybeispiele^^ allerdings habe ich im Projekt auch threads eingebaut die man ja nicht serialisieren kann…alles nicht so einfach…Trotzdem danke.