Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung |
Stand: 2024-06-27
weitgehend formuliert von Claude 3.5 Sonnet
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.
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:
file)
pickle.dump(data, print("Daten wurden serialisiert und gespeichert.")
# Deserialisierung (Laden)
with open('daten.pickle', 'rb') as file:
= pickle.load(file)
loaded_data 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.
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:
file, ensure_ascii=False, indent=4)
json.dump(data, print('Daten wurden serialisiert und gespeichert.')
# Deserialisierung (Laden)
with open('daten.json', 'r', encoding='utf-8') as file:
= json.load(file)
loaded_data 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.
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.