Question

Nous avons un système de production qui utilise beaucoup de sérialisation. Ce qui est fondamentalement faire est de stocker un objet appelé ProcessData dans la base de données de jBPM comme tableau d'octets. Ainsi, c'est sérialisé.

Considérez l'objet suivant.

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }
}

Maintenant, supposons que nous avons cet objet stocké dans la base de données de JBPM comme tableau d'octets et nous utilisons cette production.

Maintenant, plus tard, nous voulons mettre à jour cet objet ProcessData avec de nouvelles données

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }

  public void getY() {
    //not important
  }
}

Maintenant, le problème est quand charge jBPM l'objet stocké old ProcessData, nous obtenons une exception Caused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

Maintenant, ma question est, comment pouvons-nous résoudre ce problème? Comment pouvons-nous faire lire l'objet sérialisé et sorte de le transformer dans cette nouvelle classe. Est-il même possible? Rappelez-vous que nous avons un contrôle limité sur la bibliothèque JBPM.

Était-ce utile?

La solution

Il semble que vous n'utilisez pas l'exemple de code dans les deux cas, puisque dans votre exemple, vous définissez le serialVersionUID (ce qui est bon) et il est le même avant et après, mais dans votre erreur, les années UID sont différents. Pour que cela se produise, l'UID est soit non défini (ainsi généré), ou a été modifié entre les versions. Le cas généré serait également provoquer un changement entre les versions puisque les signatures de classe sont différentes.

Dans les deux cas, ce serait le comportement attendu.

Il semble que le véritable code en cours d'exécution ne correspond pas réellement votre exemple. Pour charger l'ancien code, vous devez définir l'UID dans la nouvelle version pour correspondre à celui qui existe déjà dans les classes persistées (6651422488035743444L). En outre, il est plus simple à gérer si vous utilisez des numéros simples de l'UID, comme les versions 1,2,3.

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