java - unserialize - ¿Cuándo debo cambiar el serialVersionUID?
unserialize java (4)
El mantra frecuentemente repetido sobre cambiar el serialVersionUID
cada vez que cambias la clase es completo y totalmente absurdo. Vea este artículo de Sun que republicaron en su sitio y que se migró a Oracle Technology Network después de la adquisición.
Debería cambiar el serialVersionUID
solo cuando deliberadamente quiera romper la compatibilidad con todas las serializaciones existentes , por ejemplo, cuando los cambios en su clase harán que sea tan semánticamente diferente que no tenga otra opción, en cuyo caso debería pensar muchas veces sobre lo que es que en realidad estás haciendo
En todos los demás casos, debe readObject()/writeObject()
su caldera tratando de utilizar readObject()/writeObject()
personalizados readObject()/writeObject()
y / o writeReplace()/readResolve()
y / o serialFields
para que pueda continuar leyendo los objetos de esas serializaciones existentes. Una vez que rompes eso, tendrás un gran dolor de cabeza, de hecho una pesadilla.
Sé que puedo usar serialVersionUID para controlar la versión de las clases. Y leí que puedo agregar o eliminar campos y la clase seguirá siendo compatible, solo usará los valores predeterminados.
¿Cuándo debo cambiar el serialVersionUID?
El valor del campo serialVersionUID idealmente debería modificarse cuando se realizan cambios incompatibles en la estructura de la clase. La lista completa de cambios incompatibles se enumera en la especificación de serialización de objetos Java .
Para seguir expandiéndose, los cambios incompatibles en una clase evitarán que el mecanismo de deserialización cree una instancia del objeto, porque hay información en la secuencia que no se correlaciona con la definición de la clase actual.
Puede establecer serialiVersionUID en el mismo valor durante la vida de la clase. (No siempre es una buena idea) Nota: puede implementar su propia estrategia de verificación de versión de serialización con readObject / writeObject si lo necesita y no modifica el UID.
La única vez que DEBE cambiarlo es si ya ha serializado algunos datos en un archivo y desea leerlos. Si ha cambiado por alguna razón, DEBE establecer el serialiVersionUID en la versión del archivo para tener la esperanza de poder leer los datos.
Si no especifica un campo serialVersionUID
en las clases de Serializable
, el compilador de Java especificará uno para usted, esencialmente es un hash del nombre de clase, nombres de interfaz, métodos y campos de la clase. Sin embargo, los métodos se pueden modificar en cualquier momento, por lo que si necesita cambiar la forma en que se deserializa una clase almacenada, puede anular el método readObject. Sin embargo, si especifica el campo serialVersionUID
en su código, el compilador no anulará eso incluso si realiza cambios incompatibles, lo que puede dar como resultado una excepción en el tiempo de ejecución: su IDE o compilador no le dará una advertencia. (EDITAR - gracias a EJP) IDEs como Eclipse puede insertar el UID del compilador por usted, si desea verificar fácilmente cómo el compilador ve ciertos cambios.
Si realiza cambios con frecuencia, mantenga una versión anterior del archivo de disco para probar la deserialización. Puede escribir pruebas unitarias para tratar de leer en el archivo anterior y ver si funciona o si es totalmente incompatible.
Una advertencia, personalmente he experimentado el dolor que está funcionando con las clases Serializable
originalmente pensadas para el almacenamiento a largo plazo que fueron diseñadas incorrectamente. Por ejemplo, almacenar elementos de la GUI en el disco en lugar de crearlos cuando sea necesario. Pregúntate si Serializable
es realmente la mejor manera de guardar tus datos.