2011-01-09 18 views
5

Si tengo una instancia de una clase que almaceno en una sesión, necesito que sea serializable. Esta clase tiene una variable estática, ¿se serializará en cada instancia almacenada?¿cómo funciona serializable en Java?

La variable estática es una referencia a una memoria caché que contiene una gran cantidad de datos en segundo plano. ¿Se serializarán todos estos datos? De ser así, parece preferible hacer que esta variable sea transitoria y recuperar la instancia de caché cada vez que se restaure la instancia. Tal vez no almacene la instancia de caché en absoluto en la clase.

¿El constructor se ejecuta cuando una clase se restaura desde un estado serializado? si no, ¿hay algún otro método que pueda usar para volver a instalar una variable transitoria?

+1

El constructor no-arg de la super clase no serialisable más derivada se ejecuta, pero no los constructores de las clases serializados. 'readObject' (o' readObjectNoData' puede reemplazar la deserialización predeterminada (vea los documentos API). –

+0

@Tom, reemplace? Entonces, si implemento uno de esos métodos, ¿debo manejar toda la serialización yo solo? – KTrum

+0

Trumstedt Generalmente lo haría suministro (no anulación) 'readObject'. Lo primero que el método debería hacer es llamar a' defaultReadObject' o 'readFields'. –

Respuesta

11

Esta clase tiene una variable estática, se esto puede serializar en todos los casos almacenado?

No. De acuerdo con Java Object Serialization Specificaiton: "Los campos serializables predeterminados de una clase se definen como los campos no transitorios y no estáticos."

¿Se ejecutará el constructor cuando se restaure una clase desde un estado serializado?

No. La deserialización omite constructores (a menos que tenga una superclase no serializable).

si no hay otro método que pueda utilizar para volver a instalar una variable transitoria?

Puede utilizar el método readObject() para eso, como se describe en el documento Serializable API doc.

+4

Siempre tiene una superclase no serializable. –

3

campos estáticos y transitorios no son serializados. No, el constructor no es llamado. Para más detalles, por favor, mira esto: http://java.sun.com/developer/technicalArticles/ALT/serialization/

+0

Static se puede serializar; es posible que desee consultar http: //www.ecst. csuchico.edu/~amk/foo/advjava/notes/serial.htm –

+1

Gracias por su respuesta, pero por favor, compruebe el enlace. no pude conseguir que funcione. Aunque mi interpretación de la pregunta es será una variable estática se rializado por defecto con cada instancia, y afaik, el comportamiento predeterminado para la serialización es que los datos estáticos no se serializan, ya que no se consideran parte del estado del objeto. –

+0

enlace fijo = http://www.ecst.csuchico.edu/~amk/foo/advjava/notes/serial.html –

Cuestiones relacionadas