Ce warning signale qu'une classe qui implémente l'interface
java.io.Serilizable n'a pas définit de
serialVersionUID. En effet, le
serialVersionUID permet d'affecter un numéro de version à la classe. Ce numéro doit normalement être changé lorsqu'un champs non-transiant est ajouté ou supprimé de la classe. Théoriquement, c'est le développeur qui doit créer ce champs. Toutefois, si ce champs est absent, le compilateur générera un numéro automatique.
Le champs
serialVersionUID est utilisé lors de la désérialization afin de s'assurer que les versions des classes Java soient concordantes. Si ce n'est pas le cas, une
InvalidClassException sera levée.
Or il se trouve que le calcul des
serialVersionUID par défaut est extrêmement sensible aux modifications apportées au code source et peut même varier selon les compilateurs. Ce qui a pour inconvénient de provoquer des
InvalidClassExceptions inattendus lors de la désérialisation...
Il est ainsi fortement conseillé de gérer le
serialVersionUID de toutes classes sérializable, et bien sûr de modifier cette valeur lors d'un changement sur les champs de la classe. Ce warning signalera ainsi toutes classes
Serializable sans définition du
serialVersionUID explicite :
Main.java:5: warning: [serial] serializable class Main has no definition of serialVersionUID
Pour définir le
serialVersionUID, il faut utiliser le code suivant (où
42L est le numéro de la version qui devra être changé à chaque modification sur les champs. La valeur n'a pas d'importance du moment qu'elle change lors d'un changement sur les champs à sérializer) :
private static final long serialVersionUID = 42L;
Partager