Serialization
et
SerialVersionUID
reste 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
SerialVersionUID
dans ma
Serializable
classe ?
En 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
Customer
type
SerialVersionUID
long " Dans cet article, vous apprendrez non seulement les bases de Java
SerialVersionUID
mais également son impact sur le processus de sérialisation et de désérialisation. Lorsque vous déclarez une classe, par exemple
Serializable
en 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,
SerialVersionUID
il n'y a pas de correspondance, alors le processus se terminera avec une exception
InvalidClassException
dans le flux "
main
"
java.io.InvalidClassException
et imprimera également le nom de la classe et le fichier
SerialVersionUID
. Une solution rapide pour résoudre ce problème consiste à le copier
SerialVersionUID
et à le définir comme constante de type
private
static
final
long
dans votre classe. Dans cet article, nous apprendrons pourquoi nous devrions utiliser
SerialVersionUID
en 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
SerialVersionUID
comme
static
final
long
dans 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,
SerialVersionUID
qui 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
SerialVersionUID
dans 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
SerialVersionUID
pour 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
SerialVersionUID
d'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
serialver
pour générer
SerialVersionUID
des classes. Ceci est particulièrement utile pour développer des classes ; l'utilitaire revient
SerialVersionUID
dans un format facile à copier. Vous pouvez utiliser l'
serialver
utilitaire 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
serialver
comme
GUI
commande
$ serialver –show
, cela ouvrira un inspecteur
serial version
qui prendra le nom complet de la classe et l'affichera
Serial version
.
Résumé
Maintenant que nous savons de quoi il s'agit
SerialVersionUID
et 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.
SerialVersionUID
utilisé pour indiquer la version des données sérialisées.
- Lorsque nous ne déclarons pas
SerialVersionUID
dans 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.
- 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.
- 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
.
- 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
SerialVersionUID
en Java. Nous savons maintenant pourquoi il est important de déclarer correctement
SerialVersionUID
en 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
GO TO FULL VERSION