Question

Il y a quelques mois, j'ai sérialisé un objet java.io.Serializable dans un fichier. J'ai maintenant besoin de lire le contenu, mais depuis lors, le nom de série serialVersionUID a été modifié et je reçois maintenant un "classe incompatible". Erreur. Je sais pertinemment qu'aucun des membres de données n'a changé. La vérification de serialVersionUID est donc le seul obstacle.

Existe-t-il un moyen de désactiver la vérification ou de modifier le serialVersionUID dans le fichier binaire?

CLARIFICATION

Cette question suppose que je ne peux pas éditer la source. Existe-t-il un moyen de pirater le fichier .class ou peut-être de pirater le fichier objet sérialisé (utilisez un éditeur hexadécimal et modifiez une valeur à un certain décalage)?

Était-ce utile?

La solution

Comme un hack, vous pouvez générer le serialVer que votre jvm utilise probablement à l'aide de l'outil serialver:

serialver -classpath quel que soit com.foo.bar.MyClass

Si vous définissez ensuite manuellement le serialVerUID dans votre classe, il devrait correspondre et vous devez pouvoir charger, en supposant que vous n’ayez pas modifié la classe de manière à invalider.

Autres conseils

Pourquoi ne pas modifier le serialVersionUID dans votre version actuelle, comme décrit dans la section Documentation sur la sérialisation ?

Je me suis récemment retrouvé dans une situation similaire - j'avais des objets sérialisés que je devais lire, le serialVersionUID de ces objets était différent de la version la plus récente et, dans mon cas, il y avait Deux serialVersionUID différents sont stockés dans le fichier pour la même classe (stockés à des moments différents, évidemment). Je n’avais donc pas le luxe de modifier la classe et de définir son serialVersionUID ; En fait, je devais entrer et modifier les données stockées.

Ce que j’ai découvert (en lisant le code source de java.io), c’est qu’un objet est sérialisé en enregistrant d’abord le nom de la classe (avec writeUTF () ), puis immédiatement après l’utilisation de . writeLong () pour enregistrer le serialVersionUID .

Ma solution consistait à intercepter l'exception, puis à revenir en arrière, à rechercher le nom de la classe, et immédiatement après le nom de la classe, à remplacer l'ancien serialVersionUID par le nouveau.

Il est documenté que la sérialisation n'est pas destinée à être utilisée pour les données persistantes. Pour récupérer ces données, vous devez rétrograder votre version de la machine virtuelle Java vers la version utilisée pour générer ces données.

Pour référence ultérieure, n'utilisez pas la sérialisation pour conserver les données entre les sessions de la machine virtuelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top