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.