Pourquoi le SERIALVERVERSONUID code> généré automatiquement? Je rencontrais une question sur un serveur d'applications où apparemment une ancienne classe était mise en cache. P>
3 Réponses :
Il est généré automatiquement, en fonction de la structure de la classe. Si la structure change, l'ID est régénéré (selon le Spécification de sérialisation c'est un hashof la classe). P>
Vous préférez donc définir un SerialVersionSionUID CODE>. P>
Donc, vous feriez mieux de définir une série explicite SerialVersionuid. I> Vous avez raison, mais ils feraient mieux de savoir quoi faire pour gérer cette variable en ce qui concerne la forme sérialisée de la classe ou un exercice de futilité.
Bon point, beaucoup de documentation sur cela (dont je dois lire).
Si vous utilisez Eclipse comme IDE IDE, vous pouvez cliquer avec le bouton droit de la souris sur l'avertissement de SerialVersionUID manquant et vous obtiendrez deux options: P>
1) Définissez la défaillance de l'éclipse, qui a la valeur 1L; ou de
2) Définir une valeur longue générée au hasard p>
Si vous vous souciez de la version de la version d'objets sérialisés, vous devez régénérer manuellement une nouvelle valeur chaque fois que vous modifiez la classe. Le Javadoc pour l'interface sérialisable a cela à dire sur ce qui se passe si vous ne déclarez pas de SerialversionUID du tout: P>
Si une classe sérialisable ne déclare pas explicitement de SerialVersionSionUID, le temps d'exécution de la sérialisation calculera une valeur SerialVersionUID par défaut pour cette classe en fonction de divers aspects de la classe, comme décrit dans la spécification de sérialisation de l'objet Java (TM). Toutefois, il est vivement recommandé que toutes les classes sérialisables déclarent explicitement des valeurs SerialVersionUID, car le calcul SerialVersionUID par défaut est très sensible aux détails de la classe pouvant varier en fonction des implémentations du compilateur et peut ainsi entraîner des décomptions invalides inattendues lors de la désérialisation. Par conséquent, pour garantir une valeur séralversion cohérente sur différentes implémentations de compilateur Java, une classe sérialisable doit déclarer une valeur SerialVersionUidide explicite. P> blockQuote>
Dans la pratique, j'ai constaté que même si vous commencez avec un code source identique sur deux machines ou plus (vérifiées de subversion, par exemple) où SerialVersionSionUID était indéfini dans une classe, la valeur générée par le compilateur dans la classe est différent sur chaque machine lorsque le code est compilé. Cela peut provoquer des erreurs déroutantes pendant le développement. P>
Si vous êtes sûr que vous n'aurez jamais une situation dans laquelle vous avez des objets sérialisés, qui sont hors de synchronisation avec une version plus récente de la classe (ou deux JVMS envoient des objets sérialisés hors synchronisation les uns sur les autres , peut-être dans une connexion réseau ou socket), il suffit de définir une valeur de 1L pour SerialVersionSionUid et laissez-la de cette façon pour toujours. P>
http: // téléchargement-llnw .oracle.com / Javase / 6 / Docs / API / Java / Io / Serializable.html P>
"Aléatoire" n'est pas la même chose que "générée". Pour le même fichier source (ou assez similaire), je suis sûr que l'outil est garanti de vous donner le même uuid.
«Vous devrez régénérer manuellement une nouvelle valeur chaque fois que vous modifiez la classe». Définitivement pas. C'est exactement le contraire de ce que vous devriez faire.
@EJP: 1L est Eclipse's's's's's's's's ''s> "Par défaut".
SerialVersionSionUID n'est pas généré automatiquement car il est dangereux. Lorsque SerialVersionSionUID est défini, il implique que deux versions d'une classe sont compatibles avec la sérialisation. P>
Imaginez que vous ayez une classe appelée FOO, et il a Maintenant, vous pourriez dire: "Je m'en fiche, dans ma demande, il est acceptable que ces champs soient ininitialisés". Si tel est le cas em> est le cas, vous pouvez définir la série SerialVersion de la catégorie nouvelle em> Foo Classe pour être identique à la catégorie ancienne em> foo. Cela indiquera à Java que les objets soient compatibles avec la série de sérialisement, et Java ne se plaingera pas lorsque vous désérialisez l'ancienne instance FOO dans la nouvelle classe FOO (mais les nouveaux champs seront toujours ininitialisés). P>
Si vous créez une nouvelle classe pour la première fois et que vous définissez la série SerialversionUid, Si vous changez de classe, et que vous explicitement em> veux interdire la désériorialisation d'anciennes versions, vous pouvez modifier SerialVersionUID en une nouvelle valeur. Cela entraînera une exception d'être lancée si un ancien objet est tenté d'être désérialisé dans une nouvelle instance de classe. P>
Ça a du sens. C'est quelque chose d'autre pour moi de penser à.
Je ne sais pas pourquoi cela est marqué comme la réponse correcte depuis que SerialVersionuid est généré automatiquement i>. De plus, en fonction de la situation, il peut y avoir de la valeur dans les identifiants générés automatiquement, car ils assurent un nouveau numéro lorsque la classe est modifiée, au lieu de la modification du code, puis de l'oublier. Mais évidemment pas pour tous les cas, car ce post souligne correctement.
C'est tellement simple, et pourtant, si peu de gens le comprennent (ou peuvent être dérangés de le comprendre?). Je devine de la quantité de verrouillage des capuchons que vous utilisez que vous êtes également frustré par cela.