Reglas de serialización estática de Java
serialization static (5)
Estoy trabajando en una serialización de estado de guardado con algunos métodos y campos estáticos. Podría haber jurado que la serialización y el caos causado por la estática. ¿Debería hacer que todo estático sea transitorio? ¿Y al inflar las llamadas restablecerás la estática como es normal?
"Cuando serializa una instancia de una clase, lo único que se guarda son los datos de instancia no estáticos y no transitorios. Las definiciones de clase no se guardan. Deben estar disponibles cuando intente deserializar un objeto" http://java.sun.com/developer/technicalArticles/ALT/serialization/
static
campos static
no están serializados.
static
campos static
se ignoran para la serialización.
Se actualizó para decir static
lugar de transient
como originalmente pretendí ...
static
son implícitamente transient
, por lo que no es necesario que las declare como tales.
La serialización es para serializar instancias , no clases . static
campos static
(los métodos son irrelevantes ya que son parte de la definición de la clase para que no estén serializados) se reiniciarán a cualquier valor al que estén configurados cuando se cargue la clase.
Si tiene un campo static
mutable, los cambios realizados en ese valor se perderán.
Las reglas cortas pueden ser las siguientes:
1. static
variable static
no se guarda durante la serialización. Y, por el contrario, durante el proceso de deserialización, las variables static
se inician desde la inicialización del nivel de clase.
2. Las variables basadas en palabras clave static
y transient
se ignoran durante la serialización.
3. El nombre de clase y el serialVersionUID
se serializan como una secuencia de bytes y, cuando se serialVersionUID
, el serialVersionUID
, leído de la fuente, se compara con la clase local de la misma variable static
. Es por eso que serialVersionUID
se declara como static public final
lo que no es necesario crear más objetos para comparar estos ID de versión.
- Si en caso de encontrar alguna diferencia, se produciría una InvalidClassException .