2010-10-18 12 views
24
class MyClass implements Serializable { 
    transient int myTransient; 
    //Other variables 
} 

Quando ripristino questa classe, desidero inizializzare manualmente myTransient, ma altrimenti voglio solo utilizzare la serializzazione predefinita.Per inizializzare un campo transitorio, qual è la soluzione più semplice

Come posso iniettare un metodo init() nel processo di ripristino dell'oggetto senza riscrivere l'intero meccanismo di serializzazione in quanto sembra che mi piacerebbe fare Externalizable?

+0

ho pensato di inizializzazione pigra. Due problemi qui Se non si utilizza il blocco, la variabile può essere inizializzata più volte. Se lo blocchi, potrebbe rallentare la tua app. Vedere blocco a doppio controllo per l'inizializzazione pigra: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html. la soluzione di axtavt è migliore. –

risposta

38

implementare un metodo readObject():

private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException { 
    in.defaultReadObject(); 
    myTransient = ...; 
} 

Da javadoc:

Le classi che richiedono una gestione speciale durante il processo di serializzazione e deserializzazione deve implementare metodi speciali con queste firme esatte:

privato void readObject (java.io.ObjectInputStream in) genera IOException, ClassNotFoundException;

Il metodo readObject è responsabile della lettura dallo stream e del ripristino dei campi delle classi. Può chiamare in.defaultReadObject per richiamare il meccanismo predefinito per il ripristino dei campi non statici e non transitori dell'oggetto. Il metodo defaultReadObject utilizza le informazioni nel flusso per assegnare i campi dell'oggetto salvato nel flusso con i campi con nome corrispondente nell'oggetto corrente. Questo gestisce il caso quando la classe si è evoluta per aggiungere nuovi campi. Il metodo non ha bisogno di preoccuparsi dello stato che appartiene alle sue superclassi o sottoclassi. Lo stato viene salvato scrivendo i singoli campi su ObjectOutputStream utilizzando il metodo writeObject o utilizzando i metodi per i tipi di dati primitivi supportati da DataOutput.

Consulta anche:

+1

È possibile definire la propria serializzazione se sono necessarie alcune funzionalità non incluse nell'implementazione predefinita, ma readObject dovrebbe essere sufficiente per l'inizializzazione della variabile. –

Problemi correlati