3.14.4 Cosa può essere serializzato e deserializzato?

I seguenti tipi possono essere serializzati:

I tentativi di serializzare oggetti non serializzabili, solleveranno l'eccezione PicklingError; quando questo si verifica, un numero indefinito di bytes nel file sottostante potrebbe essere già stato scritto.

Notate che le funzioni (sia built-in che definite dall'utente) vengono serializzate mediante un nome di riferimento ``pienamente qualificato'', non mediante un valore. Ciò significa che viene serializzato solo il nome della funzione, mediante il nome del modulo con cui viene definita la funzione stessa. Non vengono serializzati né il codice della funzione né alcuno dei suoi attributi. Perciò il modulo che definisce la funzione deve essere importabile nell'ambiente non serializzabile, e deve contenere l'oggettto nominato, altrimenti verrà sollevata un'eccezione. 3.5

Analogamente le classi vengono serializzate in base al nome di riferimento, cosicché vengono applicate le stesse restrizioni adottate nell'ambiente deserializzato. Notate che non viene serializzato nessun dato o codice delle classi, così nel seguente esempio l'attributo di classe attr non viene ristabilito nell'ambiente deserializzato:

class Foo:
    attr = 'a class attr'

picklestring = pickle.dumps(Foo)

Queste restrizioni sono il motivo per cui le funzioni e le classi serializzabili debbano venire definite nelle righe iniziali dei moduli.

Analogamente, quando vengono serializzate istanze di classi, non vengono serializzati attraverso di esse né il loro codice né i loro dati. Vengono serializzati solo i dati di istanze. Questo è stato fatto di proposito, così che sia possibile correggere degli errori in una classe, o aggiungere metodi alla classe, ed ancora caricare oggetti che sono stati creati con una precedente versione della classe. Se prevedete di utilizzare oggetti longevi che possano sopravvivere a molte versioni di una classe, allora può essere conveniente inserire un numero di versione nell'oggetto, in modo tale che le conversioni desiderate possano venire effettuate dal metodo della classe __setstate__().



Footnotes

... un'eccezione.3.5
L'eccezione sollevata probabilmente potrebbe essere una ImportError o una AttributeError, ma potrebbe anche essere qualcosa di diverso.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.