Pourquoi le compilateur Java créerait-il un champ synthétique serialVersionUID?
-
29-10-2019 - |
Question
Dans le cadre du débogage d'une application, j'ai remarqué que Field.getDeclaredFields()
renvoie certains champs synthétiques, y compris un champ serialVersionUID
dans une classe étendant une interface, bien qu'aucun n'étende Serializable
.
Pourquoi le compilateur ajoute-t-il de tels champs?
<₹UPDATE
En fait, il existe également un champ synthétique $VRc
créé.
La solution
Le compilateur / runtime Java ne créera pas automatiquement un champ serialVersionUID.Je soupçonne que vous utilisez une forme de cadre d'encodage de bytecode sous le capot qui est chargé d'ajouter les champs synthétiques soit à l'exécution, soit pendant la compilation.
Le champ $VRc
est produit par le framework d'instrumentation Emma, ce serait donc la raison pour au moins un des champs synthétiques.
Le champ serialVersionUID
est également ajouté par Emma , lorsque la propriété instr.do_suid_compensation
est définie sur true.
Autres conseils
Ce champ est essentiel pour la sérialisation Java.En bref: cela permet à la JVM de découvrir que la classe qui a été sérialisée (par exemple enregistrée sur le disque) a été modifiée par la suite et ne peut pas être désérialisée en toute sécurité en objet.
Consultez le chapitre Contrôle de version du document cité ci-dessus, il explique comment serialVersionUID
est utilisé.
MISE À JOUR: je viens de remarquer que votre classe n'implémente pas Serializable
.Êtes-vous sûr qu'aucune des super classes ou des interfaces implémentées n'étend pas Serializable
?