2012-03-05 4 views
3

J'essaye de mettre à jour le code d'hibernation qui a été écrit par quelqu'un d'autre dans le passé et qui court dans le problème de désérialisation. La façon dont le code original a été écrit, il n'a pas explicitement déclaré serialVersionUID et juste mis en œuvre l'interface Serializable -Hibernate Deserialization Édition

public class SamplePOJO implements Serializable { 

Maintenant, je suis en train d'ajouter une nouvelle colonne à la table et la carte à cet objet. I:

  1. table modifiée pour créer nouvelle colonne
  2. Mise à jour l'objet d'inclure un nouvel objet String et getter/setter pour cela, et
  3. Mise à jour le fichier .hbm à la carte de la colonne de la table db avec le objet.

Cependant, quand je le lance après la compilation je reçois l'erreur suivante -

"Error while deserializing from byte[]., caused by x.y.SamplePOJO; local class incompatible: stream classdesc serialVersionUID = 7997933458932550222, local class serialVersionUID = <other number internally auto generated as source didn't explicitly mention serialVersionUID>" 

Si je mets à jour le code pour inclure le serialVersionUID qui correspond à celui jeté dans l'erreur ci-dessus, il exécute sans problèmes. D'après les informations que j'ai trouvées, la cause la plus fréquente semble être les différents pots d'hibernation dans le client et le serveur. Cependant, ce n'est pas le cas ici car il utilise le même pot d'hibernation. Quelqu'un pourrait-il aider s'il y a un moyen de résoudre ce problème sans avoir à mentionner spécifiquement le serialVersionUID qui est levé pendant l'exception? De plus, si je dois m'en tenir à cette approche et si mon code passe à un autre environnement (qa/prod), s'attendrait-il à un serialVersionUID différent selon la façon dont il est sérialisé dans d'autres environnements?

J'apprécierai toute aide!

Répondre

1

Pour répondre d'abord à votre deuxième question, la génération de serialVersionUID à l'exécution par la machine virtuelle Java est spécifiée par la spécification de sérialisation d'objet Java. Alors que la génération du serialVersionUID à l'exécution est prédictible, elle peut varier entre les compilateurs java car elle dépend de la composition du fichier de classe qui est spécifique à l'implémentation du compilateur. Ainsi, votre code compilé ne devrait pas générer des serialVersionUID différents à l'exécution dans différents environnements. Vous pouvez utiliser la commande serialver du JDK pour calculer le serialVersionUID généré par l'exécution pour une classe.

Vous parlez d'avoir le fichier hibernate jar sur le client et le serveur, cela sonne comme si vous sérialisiez vos entités entre deux JVM différentes, êtes-vous sûr que le client possède la classe d'entité mise à jour? L'erreur indique que vous essayez de désérialiser un octet [] généré à partir de la sérialisation d'une version différente du fichier de classe. Vous devez soit vous assurer que vous désérialisez dans la même version de la classe ou ajouter le serialVersionUID à la classe.

+0

Merci. Vous avez clarifié mon doute. – JUG