2 Stimmen

Probleme bei der Deserialisierung

Wir haben ein Produktionssystem, das eine Menge Serialisierung verwendet. Was wir im Grunde tun, ist ein Objekt namens ProcessData als Byte-Array in der jbpm-Datenbank zu speichern. Daher ist dies serialisiert.

Betrachten Sie das folgende Objekt.

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

  public void getX() {
    //nicht wichtig
  }
}

Nehmen wir nun an, wir haben dieses Objekt als Byte-Array in der JBPM-Datenbank gespeichert und verwenden es in der Produktion.

Jetzt wollen wir später dieses ProcessData-Objekt mit neuen Daten aktualisieren

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

  public void getX() {
    //nicht wichtig
  }

  public void getY() {
    //nicht wichtig
  }
}

Das Problem ist nun, dass wir beim Laden des alten gespeicherten ProcessData-Objekts in JBPM eine Ausnahme erhalten Caused by: java.io.InvalidClassException: my.package.ProcessData; lokale Klasse inkompatibel: stream class desc serialVersionUID = 6651422488035743444, lokale Klasse serialVersionUID = -7966721901330644987

Meine Frage ist nun, wie können wir dieses Problem lösen? Wie können wir das serialisierte Objekt lesen und irgendwie in dieser neuen Klasse transformieren. Ist das überhaupt möglich? Denken Sie daran, dass wir nur begrenzte Kontrolle über die JBPM-Bibliothek haben.

2voto

Robin Punkte 23622

Es sieht so aus, als ob Sie den Beispielcode in beiden Fällen nicht verwenden, da Sie in Ihrem Beispiel die serialVersionUID definieren (das ist gut) und sie sowohl vor als auch nach dem Fehler gleich ist, aber in Ihrem Fehler sind die UIDs unterschiedlich. Um dies zu ermöglichen, ist die UID entweder nicht definiert (und somit generiert) oder wurde zwischen den Versionen geändert. Im generierten Fall würde es auch zu einer Änderung zwischen den Versionen kommen, da die Klassensignaturen unterschiedlich sind.

In jedem Fall wäre dies das erwartete Verhalten.

Es scheint, dass der tatsächlich ausgeführte Code nicht mit Ihrem Beispiel übereinstimmt. Um den alten Code zu laden, müssen Sie in der neuen Version die UID auf die bereits in den persistenten Klassen vorhandene Nummer setzen (6651422488035743444L). Außerdem ist es einfacher, die UIDs zu verwalten, wenn Sie einfache Zahlen wie Versionen 1, 2, 3 verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X