Wenn du schon eine Weile mit Java arbeitest, bist du sicher auf den Begriff Serialisierung gestoßen. Aber was bedeutet das eigentlich? Und warum sollte man es brauchen?
In diesem Beitrag erkläre ich dir Schritt für Schritt, was Serialisierung ist, wofür man sie verwendet, und zeige dir ein paar praxisnahe Beispiele.
Stell dir vor, du hast ein Java-Objekt – zum Beispiel ein Benutzerprofil mit Namen und Alter.
Normalerweise existiert dieses Objekt nur während dein Programm läuft. Sobald du das Programm beendest, ist das Objekt weg.
Serialisierung bedeutet:
Java hat dafür ein eingebautes Interface: Serializable.
Hier ein paar typische Anwendungsfälle:
Ein einfaches Beispiel
Wir erstellen eine Klasse Benutzer, die wir serialisieren möchten:
import java.io.Serializable;
public class Benutzer implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int alter;
public Benutzer(String name, int alter) {
this.name = name;
this.alter = alter;
}
public String getName() {
return name;
}
public int getAlter() {
return alter;
}
@Override
public String toString() {
return "Benutzer{name='" + name + "', alter=" + alter + "}";
}
}
Wichtige Punkte:
Serializable.serialVersionUID ist eine eindeutige Kennung der Klasse.
Damit stellt Java sicher, dass beim Deserialisieren die Version der Klasse passt.
Du solltest diesen Wert immer selbst setzen, sonst erzeugt Java automatisch einen – und das kann später Probleme bereiten, wenn du die Klasse veränderst.
Nun serialisieren wir ein Objekt der Klasse Benutzer und speichern es in einer Datei:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerialisierenDemo {
public static void main(String[] args) {
Benutzer benutzer = new Benutzer("Max Mustermann", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("benutzer.dat"))) {
oos.writeObject(benutzer);
System.out.println("Benutzer wurde serialisiert und gespeichert!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Nach der Ausführung findest du die Datei benutzer.dat, in der dein Objekt gespeichert ist (in binärer Form).
Jetzt wollen wir das gespeicherte Objekt wieder zurückholen:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserialisierenDemo {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("benutzer.dat"))) {
Benutzer benutzer = (Benutzer) ois.readObject();
System.out.println("Benutzer wurde geladen: " + benutzer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ausgabe:
Benutzer wurde geladen: Benutzer{name='Max Mustermann', alter=25}
transient SchlüsselwortManchmal möchte man nicht alle Felder eines Objekts speichern.
Zum Beispiel ein Passwort.
Mit dem Schlüsselwort transient kannst du Felder von der Serialisierung ausschließen:
public class Benutzer implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int alter;
private transient String passwort; // wird NICHT serialisiert
public Benutzer(String name, int alter, String passwort) {
this.name = name;
this.alter = alter;
this.passwort = passwort;
}
@Override
public String toString() {
return "Benutzer{name='" + name + "', alter=" + alter + "', passwort='" + passwort + "'}";
}
}
Wenn du nun ein Benutzer-Objekt speicherst und wieder einliest, ist das Passwort-Feld null, weil es nicht serialisiert wurde.
Serialisierung macht es möglich, Objekte dauerhaft zu speichern oder über Netzwerke zu übertragen.
Dafür genügt es, Serializable zu implementieren und mit der serialVersionUID stellst du sicher, dass deine Klassenversion konsistent bleibt. Mit transient kannst du sensible oder unnötige Daten von der Speicherung ausschließen.
Für Einsteiger ist es am wichtigsten zu verstehen: Serialisierung ist wie ein "Foto" deines Objekts, das du später wiederherstellen kannst.
