Quando il Pickler incontra un oggetto di un tipo di cui non sa nulla -- come un tipo di estensione -- cerca istruzioni sul modo di serializzarlo in due luoghi. Un'alternativa č che l'oggetto implementi un metodo __reduce__(). Se fornito, durante la serializzazione __reduce__() verrā chiamato senza argomenti, e restituirā o una stringa o una tupla.
Se viene restituita una stringa, nomina una variabile globale il cui contenuto viene serializzato come al solito. Quando viene restituita una tupla, deve essere di lunghezza due o tre, con la seguente semantica:
None
.
Sulla deserializzazione, il chiamabile verrā chiamato (a patto che fornisca i criteri di cui sopra), passando nella tupla degli argomenti; dovrebbe restituire l'oggetto deserializzato.
Se il secondo elemento č None
, allora invece di chiamare
l'oggetto chiamabile direttamente, il suo metodo __basicnew__()
viene chiamato senza argomenti. Dovrebbe anche restituire l'oggetto
deserializzato.
Un'alternativa per implementare il metodo __reduce__() sull'oggetto da serializzare, consiste nel registrare l'oggetto chiamabile con il modulo copy_reg. Questo modulo fornisce per i programmi un modo di registrare le ``reduction functions'' e i costruttori per i tipi definiti dall'utente. Le funzioni reduction hanno le stesse semantica ed interfaccia del metodo __reduce__() descritto sopra, eccetto per il fatto che vengono chiamate con un singolo argomento, ossia l'oggetto che deve essere serializzato.
Il costruttore registrato viene richiesto come ``safe constructor'' ai fini della deserializzazione descritti precedentemente.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.