Módulos Jackson para serialización de mapas
Tengo una clase que contiene un mapa (con clave no String) y algunos otros campos.
public class MyClass() {
private Map<KeyObject, OtherObject> map;
private String someField;
public MyClass(Map<KeyObject, OtherObject> map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
Me gustaría serializar y deserializar esta clase usando Jackson. Vi formas diferentes de hacerlo y decidí intentar usarmódulos jackson.
Seguíesta publicación y JsonDeserializer y JsonSerializer extendidos. El problema es que esas clases deberían escribirse, por lo que debería verse como
public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
Lo mismo para el KeySerializer.
Luego agregando al módulo:
module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
Pero aparentemente esto está mal ya que recibo una excepción:
keySerializer does not define valid handledType() -- must either register with method that takes type argument or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
Podría tener mi serializador y deserializador para escribirMi clase, pero luego tuve que analizarlo manualmente, lo que no es razonable.
ACTUALIZAR:
Logré evitar la creación del módulo en el código usando anotaciones
@JsonDeserialize(using = keyDeserializer.class)
@JsonSerialize(using = keySerializer.class)
private Map<KeyObject, OtherObject> map;
Pero luego tengo que serializar / deserializar toda la estructura del mapa por mi cuenta desde la salida toString (). Entonces probé una anotación diferente:
@JsonDeserialize(keyUsing = MyKeyDeserializer.class)
private Map<KeyObject, OtherObject> map;
Donde se extiende MyKeyDeserializerorg.codehaus.jackson.map.KeyDeserializer
y anulando el método
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {...}
Luego, deserialice manualmente mi clave, pero nuevamente desde la salida toString () de mi clase de clave.
Esto no es óptimo (esta dependencia del método toString ()). ¿Hay una mejor manera?