Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung | Blog RSS

Stand: 2024-06-27
weitgehend formuliert von Claude 3.5 Sonnet

Serialisierung

Idee der Serialisierung

Serialisierung ist ein wichtiges Konzept in der Programmierung, besonders wenn es um die Speicherung und Übertragung von Daten geht. Im Kern bedeutet Serialisierung, komplexe Datenobjekte in eine Form umzuwandeln, die leicht gespeichert oder übertragen werden kann. Der Name Serialisierung stammt daher, dass die Datenstrukturen in eine Folge – also Serie – an Bytes oder in eine Zeichenkette umgewandelt werden.

In Python arbeiten wir oft mit komplexen Datenstrukturen wie Listen, Dictionaries oder benutzerdefinierten Objekten. Diese Strukturen existieren im Arbeitsspeicher des Computers und sind in dieser Form nicht direkt speicherbar oder über ein Netzwerk übertragbar. Hier kommt die Serialisierung ins Spiel.

Der umgekehrte Prozess, also das Wiederherstellen der ursprünglichen Datenstruktur aus der serialisierten Form, wird als Deserialisierung bezeichnet. Dieser Vorgang ermöglicht es, die Daten zu einem späteren Zeitpunkt oder an einem anderen Ort wieder in ihrer ursprünglichen Form zu verwenden.

Python bietet verschiedene Möglichkeiten zur Serialisierung von Daten, die für unterschiedliche Anwendungsfälle geeignet sind. Pickle ist Pythons eigene Lösung und damit hier am einfachsten zu verwenden. Zur Kompatibilität mit anderen Programmiersprachen und dafür, dass Menschen die Daten lesen und editieren können, findet man dagegen hauptsächlich Lösungen auf Basis von JSON und XML.

Serialisierung mit Pickle

Pickle ist die Standardlösung in Python zur Serialisierung. Der Name Pickle stammt vom Einlegen von Gemüse in Essig (Mixed Pickles).

import pickle

# Beispieldaten
data = {
    'name': 'Max Mustermann',
    'alter': 30,
    'hobbies': ['Lesen', 'Wandern', 'Kochen'],
    'verheiratet': False
}

# Serialisierung (Speichern)
with open('daten.pickle', 'wb') as file:
    pickle.dump(data, file)
    print("Daten wurden serialisiert und gespeichert.")

# Deserialisierung (Laden)
with open('daten.pickle', 'rb') as file:
    loaded_data = pickle.load(file)
    print("Daten wurden deserialisiert und geladen.")

print("\nGeladene Daten:")
print(loaded_data)

Zum Serialisieren (Speichern) verwenden Sie pickle.dump(objekt, datei), um ein Objekt (samt der darin referenzierten Objekte!) zu serialisieren und in eine Datei zu schreiben. Die Datei ist keine Textdatei, sondern eine Binärdatei; deshalb der Binärmodus 'wb' für das Schreiben. Zum späteren Deserialisieren (Laden) nutzen Sie pickle.load(datei), um ein Objekt aus einer Datei zu deserialisieren, nun im Binärmodus zum Lesen ('rb').

Vorsicht: Erstens können Pickle-Dateien aus unsicheren Quellen schädlichen Code enthalten. Zweitens verfügt Pickle über verschiedene Protokollversionen; die neueren davon sind nicht mit alten Python-Versionen kompatibel.

Serialisierung mit JSON

JSON (JavaScript Objekt Notation) ist ein menschenlesbares Textformat für serialisierte Daten. Man kann die im Texteditor öffnen und sieht dort etwas wie:

{
    "name": "Max Mustermann",
    "alter": 30,
    "hobbies": [
        "Lesen",
        "Wandern",
        "Kochen"
    ],
    "verheiratet": false
}

So erzeugt und liest Python JSON-Dateien:

import json

# Beispieldaten
data = {
    'name': 'Max Mustermann',
    'alter': 30,
    'hobbies': ['Lesen', 'Wandern', 'Kochen'],
    'verheiratet': False
}

# Serialisierung (Speichern)
with open('daten.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)
    print('Daten wurden serialisiert und gespeichert.')

# Deserialisierung (Laden)
with open('daten.json', 'r', encoding='utf-8') as file:
    loaded_data = json.load(file)
    print('Daten wurden deserialisiert und geladen.')

print('\nGeladene Daten:')
print(json.dumps(loaded_data, ensure_ascii=False, indent=4))

Die Datei wird im Textmodus geöffnet ('w' statt 'wb'), nicht im Binärmodus. Das ensure_ascii=False erlaubt die direkte Speicherung von Unicode-Zeichen. Das indent=4 macht die JSON-Datei durch Einrückung lesefreundlicher.

JSON kann leicht mit anderen Programmiersprachen ausgetauscht werden. Außerdem ist JSON generell sicherer als Pickle, da es keine Codeausführung während des Ladens erlaubt. Die Textdateien können allerdings sehr groß werden, insbesondere, wenn Zahlenkolonnen enthalten sind. Dann sollte man die JSON-Datei mittels Zip komprimieren.

Im obigen Beispiel unterstützt JSON direkt alle verwendeten Datentypen (Strings, Zahlen, Listen, Booleans). Komplexere Python-Objekte müssten dagegen im Programm umgewandelt werden, anders als mit Pickle. Außerdem würde es kompliziert, wenn ein Objekt mehrfach von anderen Objekten referenziert wird; das Objekt würde ohne weitere Maßnahmen auch mehrfach serialisiert.

Datenaustausch mit XML

XML (Extensible Markup Language) ist eine klassische Art, um Daten in Textform darzustellen. Die Schreibweise mit spitzen Klammern (die bloß Kleiner- und Größer-Zeichen sind) ist sehr auffällig. Die Inhalte sind mit Tags (englisch für Etiketten) wie <Name> (ohne Schrägstrich) und </Name> (mit Schrägstrich) gruppiert, gegebenenfalls mehrfach verschachtelt:

<Person>
    <Name>Max Mustermann</Name>
    <Alter>30</Alter>
    <Hobbies>
        <Hobby>Lesen</Hobby>
        <Hobby>Wandern</Hobby>
        <Hobby>Kochen</Hobby>
    </Hobbies>
    <Verheiratet>false</Verheiratet>
</Person>

Diese Darstellung findet man oft in Konfigurationsdateien. Auch der Quellcode von Web-Seiten in HTML (Hypertext Markup Language) sieht ähnlich aus.

Der Umgang mit XML ist eher kompliziert und kann Sicherheitslücken aufreißen. Mehr zum Umgang damit steht in der Dokumentation.