La serializzazione è il processo di conversione di un oggetto in un flusso di byte (o una stringa), per salvarlo o trasmetterlo attraverso la rete, mentre la deserializzazione è l'operazione inversa.
Storicamente in Python il principale problema è stato standardizzare lo scambio di strutture dati complesse tra diverse applicazioni e linguaggi. A tal fine, nella libreria standard sono stati introdotti diversi moduli: in primo luogo pickle per la serializzazione di qualsiasi oggetto Python, e successivamente json per uno scambio universale con sistemi esterni.
Problema: pickle memorizza dati specifici di Python, non è sicuro (può eseguire codice arbitrario durante il caricamento) e non è compatibile con altri linguaggi, json è limitato ai tipi semplici (dict, list, str, int, float, bool e None), ma è più sicuro e ampiamente utilizzato per lo scambio tra diverse tecnologie.
Soluzione: utilizzare pickle solo per dati affidabili tra sistemi Python; utilizzare json per lo scambio con servizi esterni, sviluppo web e trasmissione di strutture di dati leggibili dall'uomo.
Esempio di codice:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Serializzazione con pickle pickled = pickle.dumps(data) # byte unpickled = pickle.loads(pickled) print(unpickled) # Serializzazione con json jsoned = json.dumps(data) # stringa unjsoned = json.loads(jsoned) print(unjsoned)
Caratteristiche chiave:
È possibile restituire attraverso pickle risposte HTTP API a sistemi esterni?
No! pickle non è uno standard di scambio dati tra linguaggi ed è estremamente insicuro: il caricamento da pickle può eseguire codice estraneo. json è molto meglio per l'interazione esterna.
È possibile serializzare funzioni, classi o funzioni lambda in json?
No. json funziona solo con tipi primitivi; le funzioni e le classi non sono serializzate né dal json standard né dalla maggior parte dei parser.
Può pickle serializzare oggetti con riferimenti ciclici?
Sì, pickle gestisce automaticamente la maggior parte dei riferimenti ciclici, anche in strutture ricorsive. Per json questo è di solito un errore fatale.
Caso negativo: Trasmissione di oggetti pickle a applicazioni client per lo scambio di dati.
Pro: implementazione semplice, tutti i tipi Python sono conservati.
Contro: estremamente pericoloso, impossibile interagire con altri linguaggi.
Caso positivo: Invio di dati tramite json, conversione di tipi non standard utilizzando encoder.
Pro: sicurezza, compatibilità, flessibilità.
Contro: limitazione ai tipi supportati, a volte richiede encoder/decoder personalizzati.