Objektserialisierung in Java: Vollständiger Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Objektserialisierung in Java: Was ist das und warum wird sie benötigt?



Serialisierung in Java ist der Prozess der Umwandlung des Zustands eines Objekts in einen Bytestrom, um ihn in einer Datei, einer Datenbank zu speichern oder über ein Netzwerk zu übertragen. Der umgekehrte Prozess – die Wiederherstellung eines Objekts aus dem Bytestrom – wird als Deserialisierung bezeichnet. Diese Technologie liegt vielen Java-Frameworks zugrunde: von RMI (Remote Method Invocation) bis hin zu Nachrichtenaustauschsystemen.



In diesem Artikel werden wir anhand praktischer Beispiele untersuchen, wie die integrierte Java-Serialisierung funktioniert, und die besten Praktiken für ihre Verwendung betrachten.



Wie funktioniert die Serialisierung in Java?



Java bietet einen integrierten Serialisierungsmechanismus über das Interface java.io.Serializable. Dieses Interface enthält keine Methoden – es ist ein Marker-Interface. Wenn eine Klasse Serializable implementiert, erlaubt die JVM automatisch die Serialisierung ihrer Objekte.



Zum Schreiben und Lesen von Objekten werden zwei Hauptklassen aus dem Paket java.io verwendet:



  • ObjectOutputStream – serialisiert ein Objekt in einen Bytestrom
  • ObjectInputStream – deserialisiert ein Objekt aus einem Bytestrom


Ein einfaches Beispiel für die Serialisierung



Erstellen wir eine Klasse Person, die serialisiert werden kann:



import java.io.Serializable;

public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private transient String password; // wird nicht serialisiert

public Person(String name, int age, String password) { this.name = name; this.age = age; this.password = password; }

@Override public String toString() { return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}"; }}


Jetzt schreiben wir den Code für die Serialisierung und Deserialisierung:



import java.io.*;

public class SerializationDemo { public static void main(String[] args) { Person person = new Person("Ivan", 30, "secret123"); // Serialisierung try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(person); System.out.println("Objekt serialisiert: " + person); } catch (IOException e) { e.printStackTrace(); }

// Deserialisierung try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { Person restoredPerson = (Person) ois.readObject(); System.out.println("Objekt wiederhergestellt: " + restoredPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }}


Programmausgabe:

Objekt serialisiert: Person{name='Ivan', age=30, password='secret123'}Objekt wiederhergestellt: Person{name='Ivan', age=30, password='null'}


Beachten Sie: Das Feld password wurde mit dem Schlüsselwort transient markiert und erhielt bei der Deserialisierung den Wert null. Dies ist die Standardmethode, um vertrauliche Daten von der Serialisierung auszuschließen.



Wichtige Besonderheiten der Serialisierung in Java



  • serialVersionUID – eine eindeutige Versionskennung der Klasse. Wenn Sie sie nicht explizit deklarieren, generiert die JVM sie automatisch, was jedoch bei einer Änderung der Klasse zu einem InvalidClassException-Fehler führen kann. Es wird empfohlen, immer private static final long serialVersionUID zu deklarieren.
  • Statische Felder werden nicht serialisiert – sie gehören zur Klasse, nicht zum Objekt.
  • Verschachtelte Objekte – wenn das zu serialisierende Objekt Verweise auf andere Objekte enthält

Empfehlungen