serialVersionUID
facilita el versionado de datos serializados. Su valor se almacena con los datos cuando se serializa. Al deserializar, se verifica la misma versión para ver cómo los datos serializados coinciden con el código actual.
Si desea versionar sus datos, normalmente comienza con un serialVersionUID
0, y lo agrega con cada cambio estructural a su clase que altera los datos serializados (agregando o eliminando campos no transitorios).
El mecanismo de deserialización incorporado ( in.defaultReadObject()
) se negará a deserializar las versiones anteriores de los datos. Pero si lo desea, puede definir su propia función readObject () que puede leer datos antiguos. Este código personalizado puede verificar elserialVersionUID
para saber en qué versión están los datos y decidir cómo deserializarlos. Esta técnica de control de versiones es útil si almacena datos serializados que sobreviven a varias versiones de su código.
Pero almacenar datos serializados durante un período de tiempo tan largo no es muy común. Es mucho más común usar el mecanismo de serialización para escribir temporalmente datos en, por ejemplo, un caché o enviarlos a través de la red a otro programa con la misma versión de las partes relevantes de la base de código.
En este caso, no está interesado en mantener la compatibilidad con versiones anteriores. Solo le interesa asegurarse de que las bases de código que se comunican tienen las mismas versiones de clases relevantes. Para facilitar tal verificación, debe mantener el serialVersionUID
mismo como antes y no olvidar actualizarlo cuando realice cambios en sus clases.
Si olvida actualizar el campo, puede terminar con dos versiones diferentes de una clase con una estructura diferente pero con la misma serialVersionUID
. Si esto sucede, el mecanismo predeterminado ( in.defaultReadObject()
) no detectará ninguna diferencia e intentará deserializar los datos incompatibles. Ahora puede terminar con un error de tiempo de ejecución críptico o una falla silenciosa (campos nulos). Este tipo de errores puede ser difícil de encontrar.
Entonces, para ayudar a este caso de uso, la plataforma Java le ofrece la opción de no configurarlo serialVersionUID
manualmente. En cambio, se generará un hash de la estructura de clases en tiempo de compilación y se usará como id. Este mecanismo se asegurará de que nunca tenga estructuras de clase diferentes con la misma identificación, por lo que no obtendrá estos fallos de serialización de tiempo de ejecución difíciles de rastrear mencionados anteriormente.
Pero hay una parte trasera de la estrategia de identificación generada automáticamente. A saber, que los identificadores generados para la misma clase pueden diferir entre los compiladores (como se mencionó anteriormente por Jon Skeet). Entonces, si comunica datos serializados entre el código compilado con diferentes compiladores, se recomienda mantener los identificadores manualmente de todos modos.
Y si usted es retrocompatible con sus datos, como en el primer caso de uso mencionado, probablemente también desee mantener la identificación usted mismo. Esto para obtener identificadores legibles y tener un mayor control sobre cuándo y cómo cambian.