ProgrammatieFullstack ontwikkelaar

Wat is serialisatie en deserialisatie van objecten in Python? Welke modules worden hiervoor gebruikt, wanneer pickle te gebruiken en wanneer json, en wat zijn hun fundamentele verschillen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Serialisatie is het proces van het omzetten van een object naar een stroom van bytes (of een string), zodat het kan worden opgeslagen of over het netwerk kan worden verzonden, terwijl deserialisatie de omgekeerde operatie is.

Historisch gezien was de belangrijkste uitdaging in Python de standaardisatie van het uitwisselen van complexe datastructuren tussen verschillende applicaties en talen. Hiervoor zijn er verschillende modules in de standaardbibliotheek verschenen: eerst pickle voor het serialiseren van alle Python-objecten, en later json voor universele uitwisseling met externe systemen.

Probleem: pickle slaat Python-specifieke gegevens op, is onveilig (kan willekeurige code uitvoeren bij het laden) en is niet compatibel met andere talen, json is beperkt tot eenvoudige types (dict, list, str, int, float, bool en None), maar is veiliger en wordt veel gebruikt voor uitwisseling tussen verschillende technologieën.

Oplossing: gebruik pickle alleen voor vertrouwde gegevens tussen Python-systemen; gebruik json voor uitwisseling met externe services, webontwikkeling en overdracht van menselijk leesbare datastromen.

Voorbeeldcode:

import pickle import json data = {'a': [1, 2, 3], 'b': True} # Serialisatie met pickle pickled = pickle.dumps(data) # bytes unpickled = pickle.loads(pickled) print(unpickled) # Serialisatie met json jsoned = json.dumps(data) # string unjsoned = json.loads(jsoned) print(unjsoned)

Belangrijkste kenmerken:

  • pickle serializeert (bijna) alle Python-objecten, maar is gevaarlijk en niet universeel.
  • json serializeert alleen basis types, maar is veilig en cross-talig.
  • Denk altijd aan de veiligheid en toepassingsgebieden.

Vragen met een valstrik.

Mag je antwoorden via pickle geven aan externe systemen via een HTTP API?

Nee! pickle is geen standaard voor gegevensuitwisseling tussen talen en is uiterst onveilig: laden uit pickle kan externe code uitvoeren. json is veel beter voor externe interactie.

Kun je functies, klassen of lambda-functies serialiseren in json?

Nee. json werkt alleen met primitieve types; functies en klassen kunnen niet worden geserialiseerd door de standaard json of de meeste parsers.

Kan pickle objecten met cyclische referenties serialiseren?

Ja, pickle behandelt automatisch de meeste cyclische referenties, tot aan recursieve structuren. Voor json is dit meestal een fatale fout.

Typische fouten en anti-patronen

  • Serialisatie van gebruikersgegevens met pickle uit onbetrouwbare bronnen is een kritieke kwetsbaarheid.
  • Proberen om niet-standaard types (zoals datetime) via json te serialiseren zonder aanpassingen leidt tot fouten.
  • Opslaan van pickle-bestanden op de server zonder beveiligingscontrole.

Voorbeeld uit de praktijk

Negatieve case: Overdracht van pickle-objecten aan clientapplicaties voor gegevensuitwisseling.
Voordelen: eenvoudige implementatie, behoudt alle Python-types.
Nadelen: uiterst gevaarlijk, onmogelijk om interactie te hebben met andere talen.

Positieve case: Gegevens verzenden via json, conversie van niet-standaard types met encoders.
Voordelen: veiligheid, compatibiliteit, flexibiliteit.
Nadelen: beperking in ondersteunde types, vereist soms een aangepaste encoder/decoder.