ProgrammazioneSviluppatore Fullstack

Che cos'è la serializzazione e la deserializzazione degli oggetti in Python? Quali moduli vengono utilizzati per questo, quando utilizzare pickle e quando json, e quali sono le differenze principiali tra di essi?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • pickle serializza (quasi) qualsiasi oggetto Python, ma è pericoloso e non universale.
  • json serializza solo tipi di base, ma è sicuro e cross-linguaggio.
  • Pensa sempre alla sicurezza e all'area di applicazione.

Domande ingannevoli.

È 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.

Errori tipici e anti-pattern

  • Serializzare con pickle dati utente provenienti da fonti inaffidabili è una vulnerabilità critica.
  • Tentare di serializzare tipi non standard (ad esempio, datetime) tramite json senza modifiche porterà a un errore.
  • Memorizzare file pickle sul server senza controlli di sicurezza.

Esempio dalla vita reale

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.