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

Cuando restauro esta clase quiero inicializar myTransient manualmente, pero de lo contrario solo quiero usar la serialización predeterminada.Para inicializar un campo transitorio, ¿cuál es la solución más simple

¿Cómo puedo inyectar un método init() en el proceso de restauración del objeto sin volver a escribir todo el mecanismo de serialización, ya que parece que Externalizable me tendría que hacer?

+0

pensé en la inicialización perezosa. Dos problemas aquí. Si no usa el bloqueo, su variable puede inicializarse varias veces. Si bloquea, puede ralentizar su aplicación. Ver el bloqueo comprobado doble para la inicialización lenta: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html. La solución de axtavt es mejor. –

Respuesta

38

implementar un método readObject():

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

De javadoc:

clases que requieren un manejo especial durante el proceso de serialización y deserialización debe implementar métodos especiales con estas firmas exactas:

privada void readObject (java.io.ObjectInputStream in) arroja IOException, ClassNotFoundException;

El método readObject es responsable de leer la secuencia y restaurar los campos de las clases. Puede invocar a inDefaultReadObject para invocar el mecanismo predeterminado para restaurar los campos no estáticos y no transitorios del objeto. El método defaultReadObject utiliza información en la secuencia para asignar los campos del objeto guardado en la secuencia con los campos correspondientes en el objeto actual. Esto maneja el caso cuando la clase ha evolucionado para agregar nuevos campos. El método no necesita preocuparse por el estado que pertenece a sus superclases o subclases. El estado se guarda escribiendo los campos individuales en ObjectOutputStream utilizando el método writeObject o utilizando los métodos para tipos de datos primitivos admitidos por DataOutput.

Consulte también:

+1

Puede definir su propia serialización si necesita algunas características no incluidas en la implementación predeterminada, pero readObject debe ser lo suficientemente bueno para la inicialización de la variable. –

Cuestiones relacionadas