PHP-Variablen existieren nur während der Laufzeit eines Skripts. Sobald die Ausführung endet, gehen alle Werte verloren. Die Funktionen serialize() und unserialize() lösen dieses Problem, indem sie beliebige PHP-Werte in einen speicherbaren String umwandeln und später daraus wiederherstellen. So lassen sich Arrays, Objekte und andere Datentypen in Datenbanken, Dateien oder Sessions ablegen, ohne ihre Struktur zu verlieren.

Zunächst lohnt sich ein Blick auf die Arbeitsweise von serialize() und das Format, in dem PHP die Daten ablegt.
Was macht serialize()?
Die Funktion serialize() nimmt einen PHP-Wert entgegen und gibt einen String zurück, der den Wert vollständig beschreibt. Dieser String enthält Informationen über den Datentyp, die Länge und den Inhalt. Das Format ist PHP-spezifisch und folgt einer kompakten Notation: s:5:"hello" steht für einen String mit fünf Zeichen, i:42 für einen Integer und b:1 für true. Arrays werden mit a: gekennzeichnet, Objekte mit O:.
flowchart TD
A["PHP-Wert"] --> B["serialize()"]
B --> C["String-Repräsentation"]
C --> D["Datenbank<br/>oder Datei"]
D --> E["unserialize()"]
E --> F["PHP-Wert"]
Der erzeugte String lässt sich anschließend beliebig speichern, übertragen oder zwischenspeichern.
Daten mit unserialize() wiederherstellen
Die Gegenfunktion unserialize() liest den serialisierten String und erzeugt daraus den ursprünglichen PHP-Wert. Dabei werden Datentypen, Strukturen und Verschachtelungen exakt wiederhergestellt. Wichtig ist, dass der String unverändert vorliegt. Bereits kleine Änderungen am serialisierten String führen zu einem Fehler bei der Deserialisierung.
Arrays serialisieren
Arrays sind der häufigste Anwendungsfall für serialize(). Sowohl numerische als auch assoziative Arrays werden vollständig abgebildet.
<?php
$daten = ['name' => 'Max', 'alter' => 28, 'aktiv' => true];
$serialisiert = serialize($daten);
echo $serialisiert;
/* a:3:{s:4:"name";s:3:"Max";s:5:"alter";i:28;s:5:"aktiv";b:1;} */
$wiederhergestellt = unserialize($serialisiert);
echo $wiederhergestellt['name']; /* Max */
Auch verschachtelte Arrays bleiben erhalten. Jeder Schlüssel und jeder Wert wird mit seinem Typ und seiner Länge codiert. Das macht das Format zuverlässig, aber auch länger als vergleichbare Formate wie JSON.
Objekte serialisieren
Objekte lassen sich ebenso serialisieren. PHP speichert dabei den Klassennamen und alle Eigenschaften des Objekts. Beim Deserialisieren muss die Klassendefinition verfügbar sein, da PHP sonst ein unvollständiges Objekt erzeugt.
<?php
class Benutzer
{
public function __construct(
public string $name,
public string $email
) {}
}
$user = new Benutzer('Max', 'max@example.com');
$gespeichert = serialize($user);
$geladen = unserialize($gespeichert);
echo $geladen->name; /* Max */
Für die Steuerung des Serialisierungsvorgangs bietet PHP zwei Mechanismen.
__sleep und __wakeup
Die Magic Methods __sleep() und __wakeup() erlauben eine gezielte Kontrolle über den Vorgang. __sleep() wird vor dem Serialisieren aufgerufen und gibt ein Array mit den Namen der Eigenschaften zurück, die gespeichert werden sollen. Datenbankverbindungen oder temporäre Caches lassen sich so ausschließen. __wakeup() wird nach dem Deserialisieren aufgerufen und eignet sich, um Verbindungen neu aufzubauen oder Initialisierungen durchzuführen.
Das Serializable Interface
Alternativ kann eine Klasse das Serializable Interface implementieren. Es definiert die Methoden serialize() und unserialize(), die vollständige Kontrolle über das gespeicherte Format geben. In neueren PHP-Versionen (ab 8.1) gilt dieses Interface als veraltet. Stattdessen empfiehlt PHP die Verwendung der Magic Methods __serialize() und __unserialize(), die als Nachfolger konzipiert sind und flexibler arbeiten.
serialize vs. json_encode
Beide Funktionen wandeln Daten in Strings um, unterscheiden sich aber in wichtigen Punkten.
<?php
$daten = ['fruechte' => ['Apfel', 'Birne'], 'anzahl' => 2];
$serialized = serialize($daten);
$json = json_encode($daten);
echo strlen($serialized); /* laenger, PHP-spezifisch */
echo strlen($json); /* kuerzer, sprachuebergreifend */
serialize() ist PHP-spezifisch und bewahrt Datentypen, Objektklassen und Referenzen. json_encode() erzeugt ein sprachübergreifendes Format, das sich für APIs und den Austausch mit JavaScript eignet. JSON kann jedoch keine PHP-Objekte mit Klassenzugehörigkeit abbilden. Für rein interne Speicherung (Sessions, Caches) ist serialize() die passende Wahl. Für den Datenaustausch mit externen Systemen bietet sich JSON an.
Sicherheitshinweise zu unserialize
Das Deserialisieren von Daten aus nicht vertrauenswürdigen Quellen birgt erhebliche Risiken. Ein Angreifer kann manipulierte Strings einschleusen, die beim Deserialisieren beliebige Objekte erzeugen. Dieses Angriffsmuster heißt Object Injection und kann zur Ausführung von Schadcode führen.
<?php
$daten = unserialize($eingabe, ['allowed_classes' => false]);
/* Nur bestimmte Klassen erlauben */
$daten = unserialize($eingabe, [
'allowed_classes' => ['Benutzer', 'Produkt']
]);
Der Parameter allowed_classes schränkt ein, welche Klassen instanziiert werden dürfen. Mit false werden alle Objekte zu __PHP_Incomplete_Class konvertiert. Grundsätzlich gilt: Deserialisiere niemals Benutzereingaben ohne diese Einschränkung. Closures und Ressourcen (wie Datenbankverbindungen) können generell nicht serialisiert werden und lösen eine Exception aus.
Fazit
serialize() und unserialize() sind zuverlässige Werkzeuge, um PHP-Daten persistent zu speichern. Sie bewahren Typen und Objektstrukturen vollständig. Für den sprachübergreifenden Datenaustausch ist JSON die bessere Wahl, für interne Speicherung bleibt die PHP-Serialisierung ein bewährtes Mittel. Verwende bei unserialize() stets den allowed_classes Parameter, um Object Injection Angriffe zu verhindern.