La sérialisation à l'exécution attribue un numéro de version à toutes les classes de sérialisation.
C'est serialVersionUID
.
Il effectue une authentification telle que des vérifications de cohérence lors de la désérialisation d'une classe sérialisée.
Si le serialVersionUID
de la classe désérialisée et la classe dans le chargeur de classe sont différents,
Le processus de désérialisation déclenche une exception ʻInvalidClassException`.
Les classes sérialisables peuvent définir leur propre serialVersionUID
.
Cependant, le champ serialVersionUID
doit être statique, long ou final.
Exemple:
private static final long serialVersionUID = 42L;
Si une classe sérialisable ne définit pas explicitement le champ serialVersionUID
, alors à partir de la sérialisation d'exécution
La valeur de serialVersionUID
est automatiquement générée par un calcul basé sur la structure de la classe telle que les champs et les méthodes de la classe.
Néanmoins, il est fortement recommandé que toutes les classes sérialisables déclarent explicitement serialVersionUID
.
La raison en est que la méthode de calcul de serialVersionUID
dépend de la structure de la classe (le calcul semble prendre beaucoup de temps) et du compilateur Java.
Des exceptions ʻInvalidClassExceptions` inattendues peuvent se produire lors de la désérialisation.
C'est pourquoi la classe définit explicitement serialVersionUID
pour garantir le même serialVersionUID
dans différents environnements de compilateur Java.
Doit être déclaré.
Nous vous recommandons également fortement d'utiliser le modificateur private dans la déclaration la plus explicite serialVersionUID
.
The serialization runtime associates with each serializable class a version number, called a serialVersionUID, which is used during deserialization to verify that the sender and receiver of a serialized object have loaded classes for that object that are compatible with respect to serialization. If the receiver has loaded a class for the object that has a different serialVersionUID than that of the corresponding sender's class, then deserialization will result in an InvalidClassException. A serializable class can declare its own serialVersionUID explicitly by declaring a field named serialVersionUID that must be static, final, and of type long: ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible.
Matériel de référence What is a serialVersionUID and why should I use it?
Ceux qui veulent en savoir plus Ce que je sais de la spécification ésotérique Serializable, ou ma compréhension
Recommended Posts