Serializacja to proces przekształcania obiektu w strumień bajtów (lub łańcuch), aby go zapisać lub przesłać przez sieć, a deserializacja to operacja odwrotna.
Historycznie największym problemem w Pythonie była standaryzacja wymiany złożonych struktur danych między różnymi aplikacjami i językami. W tym celu w standardowej bibliotece pojawiły się różne moduły: najpierw pickle do serializacji dowolnych obiektów Pythona, a później json do uniwersalnej wymiany z zewnętrznymi systemami.
Problem: pickle przechowuje dane specyficzne dla Pythona, jest niebezpieczny (może wykonać dowolny kod podczas ładowania) i nie jest kompatybilny z innymi językami, json — ogranicza się do prostych typów (dict, list, str, int, float, bool i None), ale jest bezpieczniejszy i szeroko stosowany do wymiany między różnymi technologiami.
Rozwiązanie: używać pickle tylko dla zaufanych danych między systemami Pythona; stosować json do wymiany z zewnętrznymi usługami, w web development i do przesyłania struktury danych czytelnych dla ludzi.
Przykład kodu:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Serializacja z pickle pickled = pickle.dumps(data) # bajty unpickled = pickle.loads(pickled) print(unpickled) # Serializacja z json jsoned = json.dumps(data) # łańcuch unjsoned = json.loads(jsoned) print(unjsoned)
Kluczowe cechy:
Czy można przesyłać odpowiedzi HTTP API przez pickle do zewnętrznych systemów?
Nie! pickle nie jest standardem wymiany danych między językami i jest ekstremalnie niebezpieczny: ładowanie z pickle może wykonywać obcy kod. json jest znacznie lepszy do zewnętrznych interakcji.
Czy można serializować funkcje, klasy lub funkcje lambda w json?
Nie. json działa tylko z typami prymitywnymi; funkcje i klasy nie są serializowane ani przez standardowy json, ani przez większość parserów.
Czy pickle może serializować obiekty z cyklicznymi odwołaniami?
Tak, pickle automatycznie obsługuje większość cyklicznych odwołań, aż do struktur rekurencyjnych. Dla json to zazwyczaj katastrofalny błąd.
Negatywny przypadek: Przesyłanie obiektów pickle aplikacjom klienckim do wymiany danych.
Zalety: prosta implementacja, zachowywanie wszystkich typów Pythona.
Wady: krytycznie niebezpieczne, brak możliwości interakcji z innymi językami.
Pozytywny przypadek: Wysyłanie danych przez json, przekształcanie niestandardowych typów za pomocą encodera.
Zalety: bezpieczeństwo, kompatybilność, elastyczność.
Wady: ograniczenia co do wspieranych typów, czasami wymaga niestandardowego encodera/decoder.