Pregunta

Hace unos meses serialicé un objeto java.io.Serializable en un archivo. Ahora necesito leer el contenido, pero desde entonces el serialVersionUID ha cambiado, y ahora obtengo una "clase incompatible". error. Sé con certeza que ninguno de los miembros de datos ha cambiado, por lo que la única barrera es la verificación serialVersionUID.

¿Hay alguna forma de desactivar la verificación o modificar el serialVersionUID en el archivo binario?

CLARIFICACIÓN

Esta pregunta supone que no puedo editar la fuente. ¿Hay alguna manera de hackear el archivo .class o tal vez hackear el archivo de objeto serializado (usar un editor hexadecimal y cambiar un valor en cierto desplazamiento)?

¿Fue útil?

Solución

Como truco, puedes generar el serialVer que tu jvm probablemente esté usando usando la herramienta serialver:

serialver -classpath sea lo que sea com.foo.bar.MyClass

Si luego configura manualmente el serialVerUID en su clase, debería coincidir y debería poder cargar, suponiendo que no haya cambiado la clase de tal manera que invalide.

Otros consejos

¿Por qué no modificar el serialVersionUID en su versión actual como se describe en Documentación de serialización ?

Recientemente me encontré en una situación similar: tenía algunos objetos serializados que tenía que leer, el serialVersionUID de esos objetos era diferente a la versión más reciente y, en mi caso, había un par de diferentes serialVersionUID s almacenados en el archivo para la misma clase (almacenados en diferentes momentos, obviamente). Así que no tuve el lujo de modificar la clase y configurar su serialVersionUID ; De hecho, tuve que entrar y modificar los datos almacenados.

Lo que descubrí (al leer el código fuente java.io) es que un objeto se serializa almacenando primero el nombre de la clase (usando writeUTF () ) y luego inmediatamente después de usar writeLong () para guardar el serialVersionUID .

Mi solución fue detectar la excepción y luego regresar, buscar el nombre de la clase e inmediatamente después del nombre de la clase reemplazar el antiguo serialVersionUID por el nuevo.

Está documentado que la serialización no está destinada a ser utilizada para datos persistentes. Para recuperar esos datos, deberá degradar su versión de la JVM a la versión que se utilizó para generar esos datos.

Para referencia futura, no use la serialización para conservar datos entre sesiones de la JVM.

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