Вопрос

У нас есть производственная система, которая использует много сериализации. Что в основном сделать, это хранить объект под названием ProcessData в базе данных JBPM в качестве байтового массива. Таким образом, это сериализуется.

Рассмотрим следующий объект.

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

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

Теперь давайте скажем, у нас есть этот объект, хранящийся в базе JBPM в качестве байтового массива, и мы используем это в производстве.

Сейчас позже мы хотим обновить этот объект ProcessData с новыми данными

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

  public void getX() {
    //not important
  }

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

Теперь проблема в том, когда JBPM загружает old хранится объект ProcessData, мы получаем исключениеCaused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

Теперь мой вопрос, как мы можем решить эту проблему? Как мы можем сделать прочтение сериализованного объекта и вроде преобразования его в этом новом классе. Это даже возможно? Помните, что у нас ограниченный контроль над библиотекой JBPM.

Это было полезно?

Решение

Похоже, вы не используете пример код в любом случае, поскольку в вашем примере вы определяете SerialVersionUID (это хорошо), и оно одинаково до и после, но в вашей ошибке разные UID разные. Для этого произойдет, UID либо не определен (таким образом, генерируется), либо был изменен между версиями. Сгенерированный случай также приведет к изменению между версиями, так как подписи класса разные.

В любом случае это будет ожидаемое поведение.

Похоже, что Real Code Run, который на самом деле не соответствует вашему примеру. Чтобы загрузить старый код, вам придется установить UID в новой версии, чтобы соответствовать тому, которое уже существует в сохраненных классах (6651422488035743444L). Кроме того, проще управлять UID, если вы используете простые номера, такие как версии 1,2,3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top