Si je change la classe de base étendue par une classe Java Exception, dois-je mettre à jour la valeur serialVersionUID?

StackOverflow https://stackoverflow.com/questions/1420978

Question

Prenez en compte les classes d'exception Java suivantes:

public class BarException extends RuntimeException {
    // [...]
}

public class FooException extends BarException {
    private static final long serialVersionUID = -5322002268075295537L;

    // [...]
}

Si je souhaite mettre à jour la hiérarchie d'héritage pour supprimer BarException , de sorte que FooException dérive directement de RuntimeException , faut-il modifier la valeur serialVersionUID ?

// FooException with updated inheritance hierarchy
public class FooException extends RuntimeException {
    private static final long serialVersionUID = ???;

    // [...]
}
Était-ce utile?

La solution 3

Étant donné que les spécifications ne sont pas suffisamment claires pour semer la confusion et susciter le débat, sans réponse claire, la seule option qui reste est de faire confiance aux preuves empiriques.

En prenant les exemples de la question ci-dessus, FooException dérivant de BarException dérivant de RuntimeException , puis supprimant BarException de la chaîne d'héritage, j'ai créé un exemple d'application pour essayer la sérialisation et la désérialisation dans diverses combinaisons.

J'obtiens les résultats suivants:

Tant que le serialVersionUID est conservé, je peux sérialiser et désérialiser le FooException d'origine en tant que FooException mis à jour, et vice versa.

Les mises en garde suivantes s'appliquent:

  • J'utilise JDK 1.5.0_07 et je ne l'ai pas essayé avec d'autres versions.
  • FooException a des membres de type int et Exception , qui ont été désérialisés avec succès.
  • BarException n'ajoute aucun membre supplémentaire à RuntimeException .

Autres conseils

Oui. " Déplacement des classes vers le haut ou le bas de la hiérarchie " entraînera une incompatibilité avec les instances sérialisées précédentes, conformément aux spécification de sérialisation .

La Spécification de la sérialisation Java 1.5 suggère que la suppression de classes de la hiérarchie d'héritage est une modification compatible. Par conséquent, une modification de serialVersionUID ne devrait pas être nécessaire.

Toute information supplémentaire dans le flux de sérialisation se rapportant à BarException serait ignorée lors de la désérialisation vers le nouveau FooException (dérivé directement de RuntimeException ).

Techniquement, oui, mais cela dépend de la persistance des objets sérialisés dans votre système et du contrôle du déploiement du nouveau code refactoré.

Si vous ne procédez pas à la persistance et que vous actualisez le déploiement dans son intégralité avec la nouvelle version du code, je ne vois pas la nécessité de modifier le serialVersionUID .

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