problemas de-serialización
-
01-10-2019 - |
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.
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.