TP1: Astuce pour enlever les warnings

Modérateurs : graffiop, jmdouin, agoncal, mlebihan

ellouze
Messages : 123
Inscription : 12 oct. 2007 22:27
Localisation : Paris
Contact :

TP1: Astuce pour enlever les warnings

Message par ellouze » 22 oct. 2007 13:22

Main.java:5: warning: [serial] serializable class Main has no definition of serialVersionUID
Ce warning signale qu'une classe qui implémente l'interface java.io.Serializable 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 au développeur de gérer ce numéro de version. 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 inattendues 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 :

Pour définir le serialVersionUID, il faut utiliser le code suivant (où 1L 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 = 1L;
Il suffira ensuite de modifier ce numéro de version à chaque changement important dans la classe. Le plus simple étant d'incrémenter sa valeur.

Ce warning n'est actif qu'avec les options -Xlint ou -Xlint:serial de javac 5.0...

Ceci concerne également les classes qui héritent d'une classe qui implémente Serializable, puisqu'elle devient elle-même Serializable. Ainsi, ce warning concerne toutes les classes qui étendent les composants Swing par exemple...

Bon courage. Mohamed

Répondre