mercredi 11 février 2009

SerialVersionUID

Qu'arrive-t-il quad on implémente l'interface Serializable en Java? Qu'arrive-t-il quad un étend une classe qui elle-meme implément Serializable? C'est simple, si on ne fait pas attention, le compilateur nous rappelera sans cesse d'ajouter un champs serialVersionUID avec ce doux message:
The serializable class MaClasse does not declare a static final serialVersionUID field of type long
Il y a deux façon que je connaisse de se débarrasser du message en question. Soit on ajoute l'annoation @SupressWarnings("serial") ou encore on obéit et on met en place le champs demandé.

Dans la documentation de l'API de Java, on recommande au programmeur de déclarer ce champs de façon privée. Si ce champs n'est pas déclaré, le compilateur se chargera d'en générer un d'office. Ce numéro peut varier d'un compilateur à l'autre ou suite à une modification mineur de la classe qui ne touche pas ses champs internes. Ce changement causera alors une exception si on tente de désérialiser un objet qui avait été sauvegardé avec une compilation précédente. On désire évidemment éviter cette situation. Voilà pourquoi il vaut mieux que le programmeur contrôle ce champs et modifie sa valeur quand c'est vraiment nécessaire.

Suite à quelques recherches, j'ai remarqué deux écoles de pensées. La première consiste à commencer la numérotation à 1 et avancer selon les besoins et selon les classes. J'ai rencontré cet situation dans plusieurs exemples sur le Web. Alors que si on regarde dans les source de Sun, la valeur est immense :

public final class Copies extends IntegerSyntax
implements PrintRequestAttribute, PrintJobAttribute {

private static final long serialVersionUID = -6426631521680023833L;
...
}

La seule explication possible c'est que ce numéro est généré aléatoirement et est unique pour chaque classe ou version de classe. Je me suis creusé la tête un moment pour arriver à ce genre de numéro. Je me suis même fait un programme pour le faire à ma place. Jusqu'à ce que e trouve un site extraordinaire: www.random.org. Ce site offre un service de génération de nombre aléatoire basé sur un principe physique appelé bruit atmosphérique. Pour les besoins de ma cause, le fait que ce générateur soit de classe cryptographique n'était pas son plus grand avantage. Son service me permettrait de créer une page web qui générerait des numéro de série automatiquement. Il ne me restait plus qu'à copier-coller la ligne ainsi générée dans mes classes sérializable.

Je partage donc ma trouvaille avec vous. C'est à la fois un petit utilitaire pour Java et ma première expérience Ajax. N'hésitez pas à faire vos commentaires.

Générateur de serialVersionUID



1 commentaire:

  1. Ce genre de fonction existe déja dans Eclipse et NetBeans mais ce fut un plaisir à développer ;)

    RépondreSupprimer