Zuletzt aktualisiert am 16.12.2025 7 Minuten Lesezeit

Serialisierung

Serialisierung bezeichnet in der Informatik den Prozess, bei dem Datenstrukturen oder Objekte aus dem Arbeitsspeicher in ein sequentielles Format (Byte-Strom) umgewandelt werden. Dieses Format kann dann gespeichert, über Netzwerke übertragen oder zwischengespeichert werden. Der umgekehrte Prozess - die Rekonstruktion des ursprünglichen Objekts aus dem Byte-Strom - wird als Deserialisierung bezeichnet.

Serialisierung ist fundamental für verteilte Systeme, REST APIs, Datenbanken und Caching-Systeme. Ohne Serialisierung wäre die Kommunikation zwischen verschiedenen Programmen, Prozessen oder Maschinen nicht möglich.

Warum brauchen wir Serialisierung?

Computer können in ihrem Arbeitsspeicher komplexe Objekte mit Attributen, Methoden und Referenzen zu anderen Objekten verwalten. Speichermedien und Netzwerke können jedoch nur lineare Datenströme verarbeiten. Serialisierung löst dieses Problem, indem sie eine Brücke zwischen diesen beiden Welten schlägt.

Die wichtigsten Anwendungsfälle für Serialisierung sind:

  • Datenpersistenz: Objekte in Dateien oder Datenbanken speichern und später wiederherstellen
  • Netzwerkkommunikation: Daten zwischen Client und Server austauschen (z.B. bei REST APIs)
  • Caching: Objekte in Redis oder Memcached zwischenspeichern
  • Message Queues: Nachrichten in RabbitMQ oder Apache Kafka übertragen
  • Remote Procedure Calls (RPC): Methodenaufrufe über Netzwerkgrenzen hinweg durchführen

Gängige Serialisierungsformate

Es gibt verschiedene Formate für die Serialisierung, die jeweils unterschiedliche Vor- und Nachteile haben. Die Wahl des Formats hängt von den Anforderungen deiner Anwendung ab.

JSON (JavaScript Object Notation)

JSON ist das dominierende Format für Web-APIs und den Datenaustausch im Internet. Es ist textbasiert, menschenlesbar und wird von praktisch allen Programmiersprachen unterstützt. JSON eignet sich hervorragend für einfache bis mittlere Datenstrukturen.

{
  "name": "Max Mustermann",
  "alter": 25,
  "aktiv": true,
  "hobbys": ["Programmieren", "Gaming"],
  "adresse": {
    "stadt": "Berlin",
    "plz": "10115"
  }
}

Vorteile: Menschenlesbar, universell unterstützt, kompakt
Nachteile: Keine Unterstützung für Binärdaten, begrenzte Datentypen

XML (Extensible Markup Language)

XML ist ein älteres, aber noch weit verbreitetes Format, besonders in Enterprise-Umgebungen und bei SOAP-Webservices. Es ist sehr ausdrucksstark und kann komplexe hierarchische Strukturen darstellen.

<?xml version="1.0" encoding="UTF-8"?>
<person>
  <name>Max Mustermann</name>
  <alter>25</alter>
  <aktiv>true</aktiv>
  <hobbys>
    <hobby>Programmieren</hobby>
    <hobby>Gaming</hobby>
  </hobbys>
</person>

Vorteile: Ausdrucksstark, Schema-Validierung möglich, gute Tool-Unterstützung
Nachteile: Ausführlich (größere Dateien), langsamer zu parsen als JSON

Binäre Formate

Für Performance-kritische Anwendungen gibt es binäre Serialisierungsformate wie Protocol Buffers (Google), MessagePack oder Apache Avro. Diese sind kompakter und schneller als textbasierte Formate.

Format Vorteile Einsatzgebiet
Protocol Buffers Sehr kompakt, plattformunabhängig, Schema-basiert Microservices, gRPC
MessagePack JSON-ähnlich aber binär, ~4x schneller Caching, Echtzeit-Kommunikation
Apache Avro Schema-Evolution, kompakt Big Data, Kafka

Serialisierung in verschiedenen Programmiersprachen

Java

Java bietet eine eingebaute Serialisierung über das Serializable-Interface. Objekte, die dieses Interface implementieren, können mit ObjectOutputStream serialisiert werden.

import java.io.*;

// Klasse serialisierbar machen
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int alter;
    private transient String passwort; // wird nicht serialisiert

    // Konstruktor und Getter/Setter...
}

// Serialisierung
Person person = new Person("Max", 25);
try (ObjectOutputStream out = new ObjectOutputStream(
        new FileOutputStream("person.ser"))) {
    out.writeObject(person);
}

// Deserialisierung
try (ObjectInputStream in = new ObjectInputStream(
        new FileInputStream("person.ser"))) {
    Person geladen = (Person) in.readObject();
}

Das Schlüsselwort transient markiert Felder, die nicht serialisiert werden sollen - wichtig für sensible Daten wie Passwörter. Die serialVersionUID gewährleistet die Kompatibilität zwischen verschiedenen Versionen einer Klasse.

Python

Python bietet mehrere Möglichkeiten zur Serialisierung. Das json-Modul ist die sicherste Wahl für den Datenaustausch.

import json

# JSON-Serialisierung
person = {
    "name": "Max Mustermann",
    "alter": 25,
    "hobbys": ["Programmieren", "Gaming"]
}

# Serialisieren (Objekt -> String)
json_string = json.dumps(person, indent=2)
print(json_string)

# Deserialisieren (String -> Objekt)
person_geladen = json.loads(json_string)
print(person_geladen["name"])  # Max Mustermann

# In Datei speichern
with open("person.json", "w") as f:
    json.dump(person, f)

# Aus Datei laden
with open("person.json", "r") as f:
    person_aus_datei = json.load(f)

JavaScript

JavaScript hat JSON-Unterstützung direkt in die Sprache integriert.

const person = {
  name: "Max Mustermann",
  alter: 25,
  hobbys: ["Programmieren", "Gaming"]
};

// Serialisieren
const jsonString = JSON.stringify(person);
console.log(jsonString);

// Formatiert ausgeben
const jsonFormatiert = JSON.stringify(person, null, 2);

// Deserialisieren
const personGeladen = JSON.parse(jsonString);
console.log(personGeladen.name); // Max Mustermann

Serialisierung vs. Marshalling

Die Begriffe Serialisierung und Marshalling werden oft synonym verwendet, haben aber unterschiedliche Schwerpunkte:

Aspekt Serialisierung Marshalling
Fokus Persistierung von Objekten Übertragung zwischen Prozessen
Typischer Einsatz Speichern in Dateien/Datenbanken Remote Procedure Calls (RPC)
Codebase-Info Nur Daten Kann auch Code-Referenzen enthalten
Beispiel JSON in Datei speichern Java RMI, gRPC

In der Praxis verwendet Marshalling oft Serialisierung als Teil seines Prozesses. Bei Java RMI (Remote Method Invocation) werden zum Beispiel nicht nur die Objektdaten, sondern auch Informationen darüber gespeichert, von welchem Server der zugehörige Code geladen werden kann.

Sicherheitsrisiken bei der Deserialisierung

Deserialisierungsschwachstellen gehören zu den gefährlichsten Sicherheitslücken in der Softwareentwicklung und sind regelmäßig in den OWASP Top 10 vertreten. Das grundlegende Problem: Bei der Deserialisierung werden Objekte rekonstruiert und dabei möglicherweise Code ausgeführt.

Typische Angriffsszenarien

  • Java Deserialization Attacks: Ein Angreifer erstellt einen manipulierten Byte-Strom, der bei der Deserialisierung schädlichen Code ausführt. Tools wie ysoserial können solche Payloads automatisch generieren.
  • Python Pickle Exploits: Pythons pickle-Modul kann beliebige Python-Objekte serialisieren - und damit auch schädlichen Code einschleusen.
  • YAML Unsafe Load: PyYAML mit yaml.load() ohne sicheren Loader erlaubt die Ausführung beliebiger Python-Funktionen.
  • XXE (XML External Entity): Bei unsicherer XML-Verarbeitung können Angreifer auf lokale Dateien zugreifen oder Denial-of-Service verursachen.

Schutzmaßnahmen

Die wichtigste Regel lautet: Niemals Daten aus nicht vertrauenswürdigen Quellen deserialisieren!

Weitere Schutzmaßnahmen:

  • JSON bevorzugen: JSON unterstützt keine Code-Ausführung und ist daher sicherer als Pickle, YAML oder native Java-Serialisierung
  • Input validieren: Prüfe serialisierte Daten vor der Verarbeitung auf Plausibilität
  • Whitelists verwenden: Bei Java-Serialisierung nur explizit erlaubte Klassen zulassen
  • Sichere Bibliotheken nutzen: In Python yaml.safe_load() statt yaml.load() verwenden
  • DTDs deaktivieren: Bei XML-Parsing externe Entities und DTDs deaktivieren

Performance-Vergleich der Formate

Die Wahl des Serialisierungsformats kann erhebliche Auswirkungen auf die Performance haben. Hier ein Überblick:

Format Geschwindigkeit Größe Lesbarkeit
Protocol Buffers Sehr schnell Sehr kompakt Nicht lesbar
MessagePack Schnell (~4x JSON) Kompakt Nicht lesbar
JSON Mittel Mittel Gut lesbar
XML Langsam Groß Lesbar
YAML Langsam Mittel Sehr gut lesbar

Für die meisten Web-APIs ist JSON der beste Kompromiss aus Performance, Lesbarkeit und Interoperabilität. Binäre Formate lohnen sich vor allem bei sehr hohem Durchsatz oder großen Datenmengen in Microservice-Architekturen.

Serialisierung in der IT-Ausbildung

Als angehender Fachinformatiker für Anwendungsentwicklung wirst du regelmäßig mit Serialisierung arbeiten - sei es beim Entwickeln von REST APIs, beim Speichern von Konfigurationen oder bei der Anbindung von Datenbanken. Das Verständnis der verschiedenen Formate und ihrer Vor- und Nachteile ist essentiell.

Auch Fachinformatiker für Systemintegration begegnen Serialisierung: bei der Konfiguration von Systemen (oft in YAML oder JSON), bei der Analyse von API-Kommunikation oder bei der Integration von Message-Queue-Systemen.

Zusammenfassung

  • Serialisierung wandelt Objekte in speicher- und übertragbare Formate um
  • JSON ist das Standardformat für Web-APIs und moderne Anwendungen
  • Binäre Formate wie Protocol Buffers bieten bessere Performance
  • Deserialisierung birgt erhebliche Sicherheitsrisiken
  • Die goldene Regel: Nie nicht vertrauenswürdige Daten deserialisieren

Quellen und weiterführende Links