我想为 JSR 363 添加一个自定义序列化器和反序列化器javax.measure.Quantity<Q extends Quantity<Q>>
,它基本上封装了一个“值”和一个“单元”。创建序列化器 ( extends JsonSerializer<Quantity<?>>
) 和反序列化器 ( extends StdDeserializer<Quantity<?>>
) 很容易。
但是注册它们并不容易。对于解串器,没关系;看签名:
SimpleModule.addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)
请注意,反序列化器允许扩展泛型类型。所以我可以这样做:
module.addDeserializer(Quantity.class, new MyQuantityJsonDeserializer());
但是序列化器是另一回事。查看其注册的签名:
SimpleModule.addSerializer(Class<? extends T> type, JsonSerializer<T> ser)
哦,由于受限制的泛型类型而导致的痛苦。我不能做到这一点:
module.addSerializer(Quantity.class, new MyQuantityJsonSerializer());
这是因为Quantity.class
永远不会给我一个Class<Quantity<Q extends Quantity<Q>>
。并且没有简单的转换,没有在模块方法中引入一些任意的泛型变量并使用杂技演员。即使这样也行不通:
module.addSerializer((Class<Quantity<?>>) Quantity.class, new MyQuantityJsonSerializer());
我能做的最好的事情是让我的序列化程序类QuantityJsonSerializer<Q extends Quantity<Q>> extends JsonSerializer<Q>
,然后在模块中将其注册为原始类型:
@SuppressWarnings({"rawtypes", "unchecked"})
final JsonSerializer<Quantity> quantitySerializer =
(JsonSerializer<Quantity>) new MyQuantityJsonSerializer();
module.addSerializer(Quantity.class, quantitySerializer);
呃,有多丑?但这是我能找到让它工作的唯一方法之一,我不得不通过更多的体操来消除警告。
当然SimpleModule.addSerializer()
,它的泛型参数可能会更灵活一些,类似于SimpleModule.addDeserializer()
?
我在这里报告这个问题是因为 Jackson 项目说要在这里报告错误 --- 而且我也在寻求更好的解决方法的想法。谢谢。