Serialisierung

Geschätzte Lektüre: 8 Minuten 507 Ansichten

Was ist Serialisierung?

Serialisierung ist der Prozess, bei dem ein PHP-Array (oder ein anderes Datentyp) in ein spezielles Format umgewandelt wird, das gespeichert oder übertragen werden kann. Dieses formatierte Ergebnis ist eine Zeichenkette (String), die später wieder in das ursprüngliche Array zurückverwandelt werden kann.

Warum ist das nützlich?

  • Daten für die Speicherung in Datenbanken oder Dateien vorbereiten
  • Arrays zwischen verschiedenen PHP-Skripten übertragen
  • Komplexe Datenstrukturen für Cookies oder Sessions speichern

Grundlegende Serialisierungsfunktionen

PHP bietet zwei Hauptfunktionen für die Serialisierung:
serialize() und unserialize()

// Ein Array erstellen
$meinArray = [
    'name' => 'Max Mustermann',
    'alter' => 30,
    'hobbys' => ['Lesen', 'Schwimmen', 'Programmieren']
];

// Array serialisieren
$serialisiert = serialize($meinArray);
echo $serialisiert;

Ausgabe:

a:3:
  {
    s:4:"name";
    s:13:"Max Mustermann";
    s:5:"alter";
    i:30;
    s:6:"hobbys";
    a:3:
    {
      i:0;
      s:5:"Lesen";
      i:1;
      s:8:"Schwimmen";
      i:2;
      s:12:"Programmieren";
    }
  }

Erklärung des serialisierten Strings:
• a:3 – Ein Array mit 3 Elementen
• s:4:“name“ – String mit 4 Zeichen („name“)
• s:13:“Max Mustermann“ – String mit 13 Zeichen (Wert)
• i:30 – Integer mit Wert 30
• a:3 – Ein weiteres Array mit 3 Elementen (für ‚hobbys‘)

Zurück in ein Array umwandeln:

$originalArray = unserialize($serialisiert);
print_r($originalArray);

json_encode() und json_decode()

Eine modernere Alternative ist die Verwendung von JSON (JavaScript Object Notation):

$meinArray = [
    'name' => 'Max Mustermann',
    'alter' => 30,
    'hobbys' => ['Lesen', 'Schwimmen', 'Programmieren']
];

// Zu JSON serialisieren
$json = json_encode($meinArray);
echo $json;

Ausgabe:

{
  "name":"Max Mustermann",
  "alter":30,
  "hobbys":
    ["Lesen","Schwimmen","Programmieren"]
  }

Zurück in ein Array umwandeln:

$originalArray = json_decode($json, true); // true für assoziatives Array
print_r($originalArray);

Vergleich: serialize() vs. json_encode()

Featureserialize()json_encode()
LesbarkeitSchlechtGut (JSON-Standard)
GeschwindigkeitSchnellerEtwas langsamer
KompatibilitätNur PHPAlle Sprachen
ObjektserialisierungJaNur öffentliche Eigenschaften
DatenvolumenGrößerKompakter

Praktische Anwendungsfälle

Daten in einer Datenbank speichern

// Daten vorbereiten
$userData = [
    'id' => 123,
    'last_login' => date('Y-m-d H:i:s'),
    'preferences' => [
        'theme' => 'dark',
        'notifications' => true
    ]
];

// Serialisieren und in DB speichern
$serializedData = serialize($userData);
// $db->query("INSERT INTO user_sessions (data) VALUES ('$serializedData')");

// Später auslesen und deserialisieren
// $data = $db->query("SELECT data FROM user_sessions WHERE id = 123")->fetch();
$restoredData = unserialize($serializedData);

Daten in einer Datei speichern

$config = [
    'site_name' => 'Meine Webseite',
    'admin_email' => 'admin@example.com',
    'settings' => [
        'maintenance' => false,
        'debug' => true
    ]
];

// In Datei speichern
file_put_contents('config.dat', serialize($config));

// Aus Datei lesen
$loadedConfig = unserialize(file_get_contents('config.dat'));

Daten via Cookie speichern

$cartItems = [
    ['product_id' => 101, 'quantity' => 2],
    ['product_id' => 205, 'quantity' => 1]
];

// JSON ist besser für Cookies geeignet (kleiner, lesbarer)
setcookie('shopping_cart', json_encode($cartItems), time() + 3600);

// Beim nächsten Seitenaufruf
if (isset($_COOKIE['shopping_cart'])) {
    $cart = json_decode($_COOKIE['shopping_cart'], true);
}

Sicherheitshinweise

Nie nicht vertrauenswürdige Daten deserialisieren:

// UNSICHER - könnte schädlichen Code ausführen
$data = unserialize($_GET['data']);

Alternativen für unsichere Umgebungen

// Sicherer mit JSON
$data = json_decode($_GET['data'], true);

// Oder base64-Kodierung für serialize()
$safeData = unserialize(base64_decode($_GET['data']));

Passende Serialisierungsmethode wählen:
• Für PHP-interne Nutzung: serialize( )
• Für Austausch mit anderen Systemen: json_encode( )

Erweiterte Techniken

Serialisierung von Objekten

class User {
    public $name;
    private $password;
    
    public function __construct($name, $password) {
        $this->name = $name;
        $this->password = $password;
    }
    
    // Wird vor der Serialisierung aufgerufen
    public function __sleep() {
        return ['name']; // Nur 'name' serialisieren
    }
    
    // Wird nach der Deserialisierung aufgerufen
    public function __wakeup() {
        $this->password = ''; // Passwort zurücksetzen
    }
}

$user = new User('Max', 'geheim');
$serialized = serialize($user);
$newUser = unserialize($serialized);

Benutzerdefinierte Serialisierung

class CustomSerialize {
    public function __serialize(): array {
        return [
            'data' => $this->prepareData()
        ];
    }
    
    public function __unserialize(array $data): void {
        $this->restoreData($data['data']);
    }
    
    private function prepareData() {
        // Daten für Serialisierung vorbereiten
    }
    
    private function restoreData($data) {
        // Daten nach Deserialisierung wiederherstellen
    }
}

Best Practices

  1. Für Webanwendungen bevorzugt JSON verwenden – besser lesbar und sprachübergreifend kompatibel
  2. Daten validieren – vor der Deserialisierung prüfen
  3. Größe begrenzen – große Datenmengen können Probleme verursachen
  4. Versionierung – bei Änderungen der Datenstruktur Versionen mit serialisieren
  5. Alternativen prüfen – für einfache Fälle reicht vielleicht implode/explode

Wertvolles Werkzeug

Die Serialisierung von Arrays in PHP ist ein wertvolles Werkzeug, das in vielen Szenarien nützlich ist. Die Wahl zwischen serialize() und json_encode() hängt von Ihren spezifischen Anforderungen ab. Während serialize() PHP-spezifisch und leistungsfähiger ist, bietet json_encode() bessere Kompatibilität mit anderen Systemen und Sprachen.

Dieses Dokument teilen

Serialisierung

Oder Link kopieren

INHALT

Abonnieren

×
Cancel