JavaRush /Blog Java /Random-FR /Pourquoi utiliser SerialVersionUID dans la classe Seriali...
0xFF
Niveau 9
Донецк

Pourquoi utiliser SerialVersionUID dans la classe Serialisable en Java

Publié dans le groupe Random-FR
Serializationet SerialVersionUIDreste toujours un mystère pour de nombreux développeurs Java. Je vois souvent des questions sur ce qu'est SerialVersionUID, ou que se passe-t-il si je ne déclare pas SerialVersionUIDdans ma Serializableclasse ? Pourquoi utiliser SerialVersionUID dans la classe Serialisable en Java - 1En plus d'être déroutante et rarement utilisée, une autre raison de cette question est l'avertissement manquant de l'EDI Eclipse SerialVersionUID, par exemple : " La classe Serialisisable Customer ne déclare pas de champ SerialVersionUID final statiqueSerializable de Customertype SerialVersionUIDlong " Dans cet article, vous apprendrez non seulement les bases de Java SerialVersionUIDmais également son impact sur le processus de sérialisation et de désérialisation. Lorsque vous déclarez une classe, par exemple Serializableen implémentant une interface de jeton java.io.Serializable, le runtime Java stocke une instance de cette classe sur le disque à l'aide du mécanisme de sérialisation par défaut, sauf si vous configurez le processus pour utiliser l'interface Externalisable . Lors de la sérialisation, le runtime Java crée un numéro de version pour la classe afin de pouvoir la désérialiser ultérieurement. En Java, ce numéro de version est appelé SerialVersionUID. Si, lors de la désérialisation, SerialVersionUIDil n'y a pas de correspondance, alors le processus se terminera avec une exception InvalidClassExceptiondans le flux " main" java.io.InvalidClassExceptionet imprimera également le nom de la classe et le fichier SerialVersionUID. Une solution rapide pour résoudre ce problème consiste à le copier SerialVersionUIDet à le définir comme constante de type private static final longdans votre classe. Dans cet article, nous apprendrons pourquoi nous devrions utiliser SerialVersionUIDen Java et comment utiliser l'outil Serialver JDK pour générer cet ID. Si vous débutez dans la sérialisation, vous pouvez également regarder les 10 principales questions d'entretien sur la sérialisation Java pour évaluer vos connaissances et trouver des lacunes dans votre compréhension pour une lecture plus approfondie. Comme Concurrency(la concurrence) et Multi-threading(le multithreading), Serialization(la sérialisation) est un autre sujet qui mérite d'être lu plusieurs fois.

Pourquoi utiliser SerialVersionUID en Java

Comme je l'ai dit, lorsque nous n'avons pas défini de valeur SerialVersionUIDcomme static final longdans notre classe, le mécanisme de sérialisation le fera à notre place. Ce mécanisme est sensible à de nombreux détails, y compris les champs de votre classe, leurs modificateurs d'accès, les interfaces qu'il implémente et même les différentes implémentations du compilateur ; toute modification apportée à la classe ou l'utilisation d'un compilateur différent peut produire un résultat différent, SerialVersionUIDqui en fin de compte empêcher le rechargement des données sérialisées. Il est risqué de s'appuyer sur le mécanisme de sérialisation de Java pour générer cet identifiant, c'est pourquoi c'est une bonne idée de le définir explicitement SerialVersionUIDdans votre classe Serialisable . Je recommande fortement de lire le classique Java - Joshua Bloch « Effective Java » pour comprendre la sérialisation Java et les problèmes liés à leur mauvaise gestion. D'ailleurs, le JDK fournit également un outil serialver, situé dans le répertoire bin du répertoire JAVA_HOME , sur mon ordinateur, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , qui peut être utilisé pour générer SerialVersionUIDpour les anciennes classes. Ceci est très utile si vous avez apporté des modifications à votre classe qui interrompent la sérialisation et que votre application ne parvient pas à recharger les instances sérialisées. Vous pouvez facilement utiliser cet utilitaire pour créer SerialVersionUIDd'anciennes instances, puis l'utiliser explicitement en déclarant le champ comme private static final long SerialVersionUID . À propos, il est fortement recommandé, pour des raisons de performances et de sécurité, d'utiliser le format binaire standard pour la sérialisation ; encore une fois, « Effective Java » contient plusieurs paragraphes qui démontrent les avantages du format standard de manière très détaillée.

Comment utiliser l'utilitaire Serialver JDK pour générer SerialVersionUID

Vous pouvez utiliser serialverpour générer SerialVersionUIDdes classes. Ceci est particulièrement utile pour développer des classes ; l'utilitaire revient SerialVersionUIDdans un format facile à copier. Vous pouvez utiliser l' serialverutilitaire JDK comme indiqué dans l'exemple :
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Vous pouvez également utiliser l'utilitaire serialvercomme GUIcommande $ serialver –show, cela ouvrira un inspecteur serial versionqui prendra le nom complet de la classe et l'affichera Serial version.

Résumé

Maintenant que nous savons de quoi il s'agit SerialVersionUIDet pourquoi il est important de le déclarer dans une Serializable-class, il est temps de passer en revue quelques faits importants liés à Java SerialVersionUID.
  1. SerialVersionUIDutilisé pour indiquer la version des données sérialisées.

  2. Lorsque nous ne déclarons pas SerialVersionUIDdans notre classe, le runtime Java le fait pour nous, mais ce processus est sensible à de nombreuses métadonnées de la classe, notamment le nombre de champs, le type de champs, les modificateurs d'accès aux champs, les interfaces implémentées dans la classe. , etc. Vous pouvez trouver les informations exactes dans la documentation de sérialisation d'Oracle.

  3. Il est recommandé de déclarer SerialVersionUID comme variable longue finale statique privée pour éviter le mécanisme par défaut. Certains IDE, tels qu'Eclipse , émettent également des avertissements si vous oubliez cela, par exemple : "La classe Serialisable Customer ne déclare pas de champ SerialVersionUID final statique de type long." . Bien que vous puissiez désactiver cet avertissement en accédant à Fenêtre > Préférences > Java > Compilateur > Erreurs/Avertissements > Problèmes de programmation potentiels, je suggère de ne pas le faire. Ce n'est que lorsque la récupération des données n'est pas nécessaire que je peux être négligent. Voici à quoi ressemble cette erreur dans l'IDE Eclipse. Tout ce que vous avez à faire est de prendre la première décision rapide. Pourquoi utiliser SerialVersionUID dans la classe Serialisable en Java - 2

  4. Vous pouvez également utiliser l'utilitaire Serialver du JDK pour générer une version série pour les classes en Java. L'utilitaire dispose également d'une interface graphique, qui est activée lors du passage du paramètre - show.

  5. La meilleure pratique en matière de sérialisation consiste à déclarer explicitement SerialVersionUID, pour éviter tout problème de désérialisation, en particulier si vous travaillez avec une application client-serveur qui s'appuie sur des données sérialisées, telle que RMI.
Tout se passe SerialVersionUIDen Java. Nous savons maintenant pourquoi il est important de déclarer correctement SerialVersionUIDen classe. Vous pouvez remercier votre IDE pour ce rappel, qui pourrait potentiellement interrompre la désérialisation de votre classe. Si vous souhaitez en savoir plus sur la sérialisation et les concepts associés, vous pouvez également consulter ces articles géniaux. Original ici
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION