Quiero agregar un serializador y deserializador personalizado para JSR 363 javax.measure.Quantity<Q extends Quantity<Q>> , que básicamente encapsula un "valor" y una "unidad". Crear el serializador ( extends JsonSerializer<Quantity<?>> ) y el deserializador ( extends StdDeserializer<Quantity<?>> ) es fácil.
Pero no es fácil registrarlos. Para deserializadores, está bien; mira la firma:
SimpleModule.addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)Tenga en cuenta que el deserializador permite ampliar el tipo genérico. Entonces puedo hacer esto:
module.addDeserializer(Quantity.class, new MyQuantityJsonDeserializer());Pero el serializador es otra historia; mira la firma para su registro:
SimpleModule.addSerializer(Class<? extends T> type, JsonSerializer<T> ser)Oh, el dolor que esto causa debido al tipo genérico restringido. No puedo hacer esto:
module.addSerializer(Quantity.class, new MyQuantityJsonSerializer()); Esto se debe a que Quantity.class nunca me dará un Class<Quantity<Q extends Quantity<Q>> . Y no hay un lanzamiento fácil alrededor de esto, sin introducir alguna variable genérica arbitraria en el método del módulo y usar lanzamientos acrobáticos. Incluso esto no funcionará:
module.addSerializer((Class<Quantity<?>>) Quantity.class, new MyQuantityJsonSerializer()); Lo mejor que he podido hacer es crear mi clase de serializador QuantityJsonSerializer<Q extends Quantity<Q>> extends JsonSerializer<Q> , y luego en el módulo registrarlo como el tipo sin procesar:
@SuppressWarnings({"rawtypes", "unchecked"}) final JsonSerializer<Quantity> quantitySerializer = (JsonSerializer<Quantity>) new MyQuantityJsonSerializer(); module.addSerializer(Quantity.class, quantitySerializer);Uf, ¿qué tan feo es eso? Pero esa es una de las únicas formas que puedo encontrar para que funcione, y tuve que pasar por más gimnasia para eliminar las advertencias.
Seguramente SimpleModule.addSerializer() podría haber sido un poco más flexible en sus parámetros genéricos, de forma análoga a SimpleModule.addDeserializer() .
Estoy reportando esto aquí porque el proyecto Jackson dijo que se reportaran errores aquí --- y también estoy pidiendo mejores ideas para solucionarlos. Gracias.
En SimpleModule hay una versión sobrecargada de addSerializer() :
public SimpleModule addSerializer(JsonSerializer<?> ser)que permite que esto funcione:
module.addSerializer(new MyQuantityJsonSerializer());siempre que defina su serializador como:
public class MyQuantityJsonSerializer extends StdSerializer<Quantity<?>> { public MyQuantityJsonSerializer() { // Note: second argument here is ignored. super(Quantity.class, false); } @Override public void serialize(Quantity<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // Serialize value here... } }