Verjsones una librería de serialización Java-JSON especializada en permitir evolucionar estructuras de datos sobre grafos de objetos ya serializados usando transformación y pasos de validación entre versiones:
¿Qué problema quiere resolver?
Cuando tienes que enviar un grafo de objetos de un proceso a otro tenemos que serializar los datos en un formato de intercambio que pueda leer el receptor.
En Java hay muchas formas de hacer esto: serialización Java nativa, XML (XStream, ..), JSON (Gson, Jackson, ..), SOAP, y más (Avro, Protobuf, ..).
Estas soluciones funcionan muy bien hasta que el objeto cambia demasiado.
¿Qué ocurre si ocurren cambios complejos en la clase y queremos mantener limpio el código del modelo de objeto? Por supuesto, podemos actualizar de versión/modelo, pero, ¿qué pasa con los mensajes en vuelo que todavía tienen que procesarse y están serializados en alguna versión anterior?
lized Java/JSON serialization-library that allows evolvable data-structures on already serialized object-graphs by using transformation and validation steps between versions.
¿Cómo lo resuelve Verjson?
Con Verjson, cada objeto serializado incluye su número de versión junto con otros metadatos.
Verjson utiliza Jackson para generar JSON como formato intermedio. Cuando la estructura del objeto-grafo cambia, se debe implementar una clase simple de Transformación que realice los pasos para transformar de una versión a otra.
La transformación se aplica directamente en el JSON serializado, lo que mejora el rendimiento y evita la redundancia de código, etc.
Para garantizar la corrección, el resultado transformado puede ser opcionalmente validado contra un esquema JSON.
Veamos un ejemplo para ilustrar el proceso:
Tenemos un bean simple que debe ser serializado:
Primero creamos una instancia de Verjson que contiene la configuración y administra la serialización. En este caso no hay configuración, ya que esta es la primera versión que no requiere transformaciones (la validación es opcional):
Ya puedo serializar/deserializar objetos ExampleBean:
Ahora imaginemos que los requisitos cambian y queremos tener una lista en lugar de un único campo String. No queremos perder datos y tener el contenido del campo "text" como primer elemento. Además, el nombre del campo "number" debe cambiarse a "counter". Cambiamos el ExampleBean (no hay que mantener la versión anterior copiada en alguna parte), ahora queda así:
Para transformar los datos antiguos, tenemos que escribir una clase Transformation (Transformations contiene métodos estáticos que deberían ser estáticos importados):
Luego creamos la configuración para Verjson subclasificando Versiones. Esta clase de configuración crecerá con el tiempo, se agregarán nuevas versiones / transformaciones y validación.
Los serializadores/deserializadores personalizados se registrarán aquí también.
El ejemplo que serializa en versión 2 y es capaz de serializar en versión 1 y 2 quedaría así:
Para usarlo sólo necesitamos incluir esta dependencia en Maven:
En los ejemplos podemos encontrar usos más sofisticados.