Pregunta

Tenemos un sistema de producción que utiliza una gran cantidad de serialización. Lo que básicamente hacer es almacenar un objeto llamado ProcessData en la base de datos jbpm como matriz de bytes. Por lo tanto esta es serializado.

Considere el siguiente objeto.

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

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

Ahora digamos que tenemos este objeto almacenado en la base de datos JBPM como matriz de bytes y estamos utilizando esto en la producción.

Ahora más adelante queremos actualizar este objeto ProcessData con nuevos datos

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

  public void getX() {
    //not important
  }

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

Ahora el problema es cuando las cargas jbpm la old almacenado objeto ProcessData, obtenemos una excepción Caused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

Ahora mi pregunta es, ¿Cómo podemos resolver este problema? ¿Cómo podemos hacer que leyó el objeto serializado y tipo de transformarlo en esta nueva clase. ¿Es posible? Recuerde que tenemos un control limitado sobre la biblioteca JBPM.

¿Fue útil?

Solución

Parece que no está utilizando el código de ejemplo, en cualquiera de los casos, ya que en el ejemplo que se está definiendo la serialVersionUID (esto es bueno) y es la misma antes y después, pero en su error, los de UID son diferentes. Para que esto ocurra, el UID o bien no está definido (por lo tanto genera), o se ha cambiado entre las versiones. El caso generado también causaría un cambio entre las versiones ya que las firmas de clase son diferentes.

En cualquier caso, este sería el comportamiento esperado.

Parece que el código real que se está ejecutando en realidad no coincida con su ejemplo. Para cargar el código antiguo, tendrá que configurar el UID en la nueva versión para que coincida con la que ya existe en las clases persistido (6651422488035743444L). Además, es más fácil de administrar el UID de si utiliza los números simples, como las versiones 1.2.3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top