[英]Jackson module signature prevents addings serializers for self-referencing generic types
我想为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()
?
我在这里报道这是因为杰克逊项目在这里报告错误 - 我也要求更好的解决方法。 谢谢。
在SimpleModule
有一个addSerializer()
的重载版本:
public SimpleModule addSerializer(JsonSerializer<?> ser)
这允许它工作:
module.addSerializer(new MyQuantityJsonSerializer());
只要将序列化程序定义为:
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...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.