2012-01-12 2 views
2

Brève question: comment découvrir le serialVersionUID des objets qui sont sous forme sérialisée.comment découvrir serialVersionUID des objets sérialisés

Détail: J'ai certaines versions sérialisées d'objets dans une base de données de session pour une application Web. Pour certains de ces objets, j'ai omis de spécifier un serialVersionUID dans le code source, de sorte que la machine virtuelle Java en a créé une pour moi. Je veux découvrir quel est le serialVersionUID des objets sauvegardés afin que je puisse le coder en dur dans mes fichiers source.

J'ai un accès facile à lire les données sérialisées. J'ai déjà parcouru et supprimé les (anciennes) sessions qui ne seront pas lues avec les versions actuelles de mon code, donc je sais que chaque objet sérialisé correspond à la base de code actuelle.

+0

duplication possible de [Comment puis-je trouver le serialVersionUID d'un objet Java sérialisé?] (Http://stackoverflow.com/questions/703591/how-can-i-find-out-the-serialversionuid-of- a-serialized-java-object) –

+0

Les réponses à cet article traitent plus de la génération du serialVersionUID à partir des fichiers source/classe. Je veux découvrir le serialVersionUID dans les objets sérialisés existants. – Mitch

Répondre

2

Puisque vous avez les données, vous pouvez simplement regarder les huit octets après le nom de la classe dans le flux comme indiqué par la grammar for Java Serialization

00000000: aced 0005 7372 0003 466f 6f00 0000 0000 ....sr..Foo..... 
00000010: 0000 0102 0001 4c00 066d 794e 616d 6574 ......L..myNamet 
00000020: 0012 4c6a 6176 612f 6c61 6e67 2f53 7472 ..Ljava/lang/Str 
00000030: 696e 673b 7870 7400 044a 6f68 6e   ing;xpt..John 

Le nom de la classe ci-dessus est « Foo » (pas de paquet), et le serialVersionUID est 1L. Voici un autre exemple:

00000000: aced 0005 7372 0011 7374 6163 6b6f 7665 ....sr..stackove 
00000010: 7266 6c6f 772e 466f 6fff ffff ffff 7e3c rflow.Foo.....~< 
00000020: 1802 0001 4c00 066d 794e 616d 6574 0012 ....L..myNamet.. 
00000030: 4c6a 6176 612f 6c61 6e67 2f53 7472 696e Ljava/lang/Strin 
00000040: 673b 7870 7400 044a 6f68 6e    g;xpt..John 

Le nom de classe est stackoverflow.Foo. Le serialVersionUID est 0xff7e3c18 comme indiqué par cette séquence d'octets:

ff ffff fffff 7e3c 18 

Maintenant, tout ce que vous avez à faire est de regarder le format de fichier pour savoir où votre objet est dans chaque cas et lisez la serialVersionUID qui suit immédiatement le className dans la grammaire liée ci-dessus.

1

Ce qui a fonctionné pour moi est d'utiliser ObjectStreamClass.lookup (class).

Je lance une méthode qui désérialise tous les objets de session dans ma base de données. Ensuite, j'exécute ObjectStreamClass.lookup() sur chaque classe qui m'intéresse. Il me donne un objet ObjectStreamClass pour la classe. Un objet ObjectStreamClass contient le nom de la classe et le serialVersionUID.

Je vais prendre la sortie de cela et modifier mes fichiers source en conséquence.

+0

Le code des classes est-il toujours le même que pour toutes les instances sérialisées de votre base de données? – jbindel

+0

Si la classe a réellement été modifiée, ObjectStreamClass.lookup() peut lancer java.io.InvalidClassException' si la classe a réellement été modifiée. Si ça ne change pas, alors ça ne sert à rien de faire ça; il suffit d'utiliser 'serialver package.Class'. Comment obtenez-vous la classe à passer à 'lookup()'? – jbindel

+0

ObjectStreamClass.lookup() a bien fonctionné pour moi. Pour obtenir la liste des classes je viens de masser une liste de noms de fichiers du paquet que je connais a le code sans le serialVersionUID explicite. – Mitch

Questions connexes