La sérialisation Java - java.io.InvalidClassException classe locale incompatible

J'ai une classe publique, qui implémente Serializable, qui est prolongée par plusieurs autres classes. Seuls les sous-classes ont jamais été sérialisé avant - jamais de la super-classe.

La super-classe a défini un serialVersionUID.

Je ne sais pas si c'est important, mais il n'a pas été marqué comme privé, mais plutôt il a juste eu le défaut de protection, vous pourriez dire que c'était package protégé

static final long serialVersionUID = -7588980448693010399L;

La super-classe, ni aucune des sous-classes, toutefois mis en œuvre des méthodes readObject ou writeObject, et aucune des sous-classes avait expressément une serialVersionUID. J'ai pensé que celui défini dans la super-classe serait suffisant.

Malgré tout cela, les choses étaient bien dans la lecture précédemment objets sérialisés jusqu'à ce qu'une nouvelle variable d'instance, une Liste/liste de tableaux, avec une nouvelle formule a été ajouté à la super-classe, et certaines variables d'instance ont été ajoutés à l'un de ses sous-classes.

Maintenant lorsque j'essaie de lire auparavant les objets sérialisés, une exception est levée. L'un de semblable à ceci:

com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196

Je suppose que c'est dû au fait que la valeur par défaut serialVersionUID, qui a été utilisé parce que je n'ai pas de déclarer dans aucune des sous-classes, a maintenant changé en raison de changements dans la super-classe et une sous-classe.

Des Suggestions sur la façon de sortir de ce dilemme serait appréciée. Je suppose que j'ai besoin pour mettre en œuvre les méthodes readObject et writeObject, mais d'autres que de se prévaloir de defaultReadObject() et defaultWriteObject(), je ne suis pas exactement sûr de ce que je dois faire. Je ne sais si je dois ajouter serialVerisonUIDs à toutes les sous-classes ou si les méthodes readObject et writeObject doivent être mises en œuvre par chaque sous-classe, ou si je peux tout mettre en œuvre une fois, en supposant que je dois à tous, dans la superclasse.

InformationsquelleAutor Dale | 2011-12-01