Serialisierung ist der Prozess der Umwandlung eines Objekts in einen Byte-Strom (oder einen String), um es zu speichern oder über ein Netzwerk zu übertragen, während Deserialisierung die umgekehrte Operation ist.
Historisch gesehen war die Hauptproblematik in Python die Standardisierung des Austauschs komplexer Datenstrukturen zwischen verschiedenen Anwendungen und Sprachen. Dazu wurden in der Standardbibliothek verschiedene Module eingeführt: zunächst pickle für die Serialisierung beliebiger Python-Objekte und später json für den universellen Austausch mit externen Systemen.
Problem: pickle speichert Python-spezifische Daten, ist unsicher (kann beliebigen Code beim Laden ausführen) und nicht mit anderen Sprachen kompatibel, json ist auf einfache Typen (dict, list, str, int, float, bool und None) beschränkt, aber sicherer und wird häufig für den Austausch zwischen verschiedenen Technologien verwendet.
Lösung: Verwenden Sie pickle nur für vertrauenswürdige Daten zwischen Python-Systemen; wenden Sie json für den Austausch mit externen Diensten, Webentwicklung und die Übertragung menschenlesbarer Datenstrukturen an.
Beispielcode:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Serialisierung mit pickle pickled = pickle.dumps(data) # Bytes unpickled = pickle.loads(pickled) print(unpickled) # Serialisierung mit json jsoned = json.dumps(data) # String unjsoned = json.loads(jsoned) print(unjsoned)
Wichtige Merkmale:
Kann man über pickle Antworten von HTTP-APIs an externe Systeme senden?
Nein! pickle ist kein Standard für den Datenaustausch zwischen Sprachen und äußerst unsicher: das Laden aus pickle kann fremden Code ausführen. json ist viel besser für externe Interaktionen.
Kann man Funktionen, Klassen oder Lambda-Funktionen mit json serialisieren?
Nein. json arbeitet nur mit primitiven Typen; Funktionen und Klassen werden weder von standardmäßigem json noch von den meisten Parsern serialisiert.
Kann pickle Objekte mit zirkulären Verweisen serialisieren?
Ja, pickle verarbeitet automatisch die meisten zirkulären Verweise, sogar rekursive Strukturen. Bei json führt dies normalerweise zu einem fatalen Fehler.
Negativer Fall: Übertragung von pickle-Objekten an Client-Anwendungen zum Datenaustausch.
Vorteile: einfache Implementierung, Erhaltung aller Python-Typen.
Nachteile: kritisch gefährlich, keine Interaktion mit anderen Sprachen möglich.
Positiver Fall: Datenübergabe über json, Umwandlung nicht-standardisierter Typen mit Hilfe von Encodern.
Vorteile: Sicherheit, Kompatibilität, Flexibilität.
Nachteile: Einschränkungen bei den unterstützten Typen, manchmal erfordert es benutzerdefinierte Encoder/Decoder.