Uso de readClassDescriptor () y quizás resolverClass () para permitir el control de versiones de Serialización
Estoy investigando diferentes opciones en el mecanismo de serialización de Java para permitir flexibilidad en nuestras estructuras de clase para el almacenamiento tolerante a la versión (y abogando por un mecanismo diferente, no es necesario que me lo diga).
Por ejemplo, el mecanismo de serialización predeterminado puede manejar tanto la adición como la eliminación de campos, si solo se requiere compatibilidad con versiones anteriores.
Sin embargo, cambiar el nombre de una clase o trasladarlo a un paquete diferente ha resultado ser mucho más difícil. Me encontré enesta pregunta que pude hacer un simple cambio de nombre de clase y / o mover un paquete, subclasificando ObjectInputStream y anulando readClassDescriptor ():
if (resultClassDescriptor.getName().equals("package.OldClass"))
resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);
Eso está bien para un simple cambio de nombre. Pero si luego intenta agregar o eliminar un campo, obtiene una java.io.StreamCorruptedException. Peor aún, esto sucede incluso si se ha agregado o eliminado un campo, yentonces cambia el nombre de la clase, lo que podría causar problemas con múltiples desarrolladores o múltiples registros.
Basándome en algunas de las lecturas que había hecho, experimenté un poco con también reemplaza a resolverClass (), con la idea de que estábamos reubicando correctamente el nombre en la nueva clase, pero sin cargar la clase anterior y bombardeando los cambios de campo. Pero esto se debe a una comprensión muy vaga de algunos de los detalles del mecanismo de serialización, y no estoy seguro si incluso estoy ladrando el árbol correcto.
Así que 2 preguntas precisas:
¿Por qué volver a escribir el nombre de la clase usando readClassDescriptor () hace que la deserialización falle en los cambios de clase normales y compatibles?¿Hay alguna manera de usar resolverClass () u otro mecanismo para solucionar esto y permitir que las clases evolucionen (agregar y eliminar campos) y renombrarse / reempacarse?Hurgué y no pude encontrar una pregunta equivalente en SO. De todos modos, señáleme una pregunta de este tipo si existe, pero lea la pregunta con la suficiente atención para que no me cierre a menos que otra pregunta realmente responda a mi pregunta precisa.