¿Por qué el compilador de Java crearía un campo sintético serialVersionUID?
-
29-10-2019 - |
Pregunta
Como parte de la depuración de una aplicación, noté que Field.getDeclaredFields()
devuelve algunos campos sintéticos, incluido un serialVersionUID
campo en una clase que extiende una interfaz, aunque ninguno extiende Serializable
.
¿Por qué el compilador agrega tales campos?
ACTUALIZAR
De hecho, también hay una $VRc
campo sintético creado.
Solución
El compilador/tiempo de ejecución de Java no creará automáticamente un campo serialVersionUID.Sospecho que está utilizando algún tipo de marco de mejora de código de bytes bajo el capó al que se le indica que agregue los campos sintéticos ya sea en tiempo de ejecución o durante la compilación.
El $VRc
El campo es producido por el marco de instrumentación Emma, por lo que esa sería la razón para al menos uno de los campos sintéticos.
El serialVersionUID
el campo también es añadido por Emma, cuando el instr.do_suid_compensation
La propiedad se establece en verdadero.
Otros consejos
Este campo es esencial para Java publicación por entregas. En resumen: permite que el JVM descubra que la clase que fue serializada (por ejemplo, guardada en el disco) se ha cambiado después y no se puede deserializar de manera segura al objeto.
Mira esto Control de versiones capítulo En el documento citado anteriormente, explica cómo serialVersionUID
se usa.
ACTUALIZACIÓN: Acabo de notar que su clase no se implementa Serializable
. ¿Estás seguro de que ninguna de las súper clases o interfaces implementadas no se extiende? Serializable
?