programowanieProgramista Fullstack

Czym jest serializacja i deserializacja obiektów w Pythonie? Jakie moduły są do tego używane, kiedy stosować pickle, a kiedy json, i jakie są ich zasadnicze różnice?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • pickle serializuje (prawie) wszystkie obiekty Pythona, ale jest niebezpieczny i nieuniwersalny.
  • json serializuje tylko podstawowe typy, za to jest bezpieczny i międzyjęzykowy.
  • Zawsze myśl o bezpieczeństwie i obszarze zastosowań.

Pytania z pułapkami.

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.

Typowe błędy i antywzorce

  • Serializacja z pickle danych użytkowników z niepewnych źródeł — krytyczna luka bezpieczeństwa.
  • Próba serializacji niestandardowych typów (np. datetime) przez json bez poprawek — otrzymamy błąd.
  • Przechowywanie plików pickle na serwerze bez kontroli bezpieczeństwa.

Przykład z życia

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.