Frage

Wir haben ein Produktionssystem, das eine Menge Serialisierung verwendet. Was im Grunde sein tun ist, speichert ein Objekt Processdata in der jbpm Datenbank als Byte-Array bezeichnet. Somit wird diese serialisiert.

Betrachten Sie das folgende Objekt.

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

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

Jetzt können wir sagen, dieses Objekt haben in der JBPM Datenbank als Byte-Array gespeichert und wir verwenden diese in der Produktion.

Jetzt später wollen wir dieses Processdata-Objekt mit einem neuen Datum aktualisieren

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

  public void getX() {
    //not important
  }

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

Das Problem ist jetzt, wenn JBPM lädt die old gespeichert Processdata-Objekt, wir eine Ausnahme erhalten Caused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

Nun meine Frage ist, wie können wir dieses Problem lösen? Wie können wir das serialisierte Objekt machen lesen und sortieren es in dieser neuen Klasse zu verwandeln. Ist es überhaupt möglich? Denken Sie daran, dass wir nur eine eingeschränkte Kontrolle über die JBPM Bibliothek haben.

War es hilfreich?

Lösung

Es sieht aus wie Sie den Beispielcode in jedem Fall verwenden, da in Ihrem Beispiel Sie die serialVersionUID definieren (das ist gut) und es ist das gleiche vor und nach, aber in Ihrem Fehler, ist die UID sind anders. Damit dies geschehen kann, wird die UID entweder nicht (so erzeugte) definiert ist, oder ist zwischen den Versionen geändert. Der erzeugte Fall würde auch eine Änderung zwischen den Versionen verursachen, da die Klassensignaturen unterschiedlich sind.

In jedem Fall wäre dies das erwartete Verhalten sein.

Es sieht aus wie die echten Code Sein Lauf nicht wirklich Ihr Beispiel entsprechen. Um den alten Code zu laden, müssen Sie die UID in der neuen Version setzen müssen, um den einen entsprechen, was existiert bereits in den beharrte Klassen (6651422488035743444L). Außerdem ist es einfacher, die UID zu verwalten, wenn Sie einfache Zahlen verwenden, wie Versionen 1,2,3.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top