首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson模块签名防止添加自引用泛型类型的序列化程序

Jackson模块签名防止添加自引用泛型类型的序列化程序
EN

Stack Overflow用户
提问于 2017-03-11 01:01:23
回答 1查看 809关注 0票数 8

我想为JSR363 javax.measure.Quantity<Q extends Quantity<Q>>添加一个自定义的序列化和反序列化,它基本上封装了一个“值”和一个“单元”。创建序列化程序(extends JsonSerializer<Quantity<?>>)和反序列化程序(extends StdDeserializer<Quantity<?>>)很容易。

但是注册它们并不容易。对于反序列化程序,这是可以的;看看签名:

代码语言:javascript
复制
SimpleModule.addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)

请注意,反序列化程序允许扩展泛型类型。所以我可以这样做:

代码语言:javascript
复制
module.addDeserializer(Quantity.class, new MyQuantityJsonDeserializer());

但是序列化程序是另一回事;看看它的注册签名:

代码语言:javascript
复制
SimpleModule.addSerializer(Class<? extends T> type, JsonSerializer<T> ser)

哦,这会因为受限泛型类型而带来的痛苦。我不能这样做:

代码语言:javascript
复制
module.addSerializer(Quantity.class, new MyQuantityJsonSerializer());

这是因为Quantity.class永远不会给我一个Class<Quantity<Q extends Quantity<Q>>。如果不在module方法中引入一些任意的泛型变量并使用杂技类型转换,就不容易绕过这个问题。即使这样也行不通:

代码语言:javascript
复制
module.addSerializer((Class<Quantity<?>>) Quantity.class, new MyQuantityJsonSerializer());

我所能做的最好的事情就是让我的序列化程序类QuantityJsonSerializer<Q extends Quantity<Q>> extends JsonSerializer<Q>,然后在模块中将它注册为原始类型:

代码语言:javascript
复制
@SuppressWarnings({"rawtypes", "unchecked"})
final JsonSerializer<Quantity> quantitySerializer =
    (JsonSerializer<Quantity>) new MyQuantityJsonSerializer();
module.addSerializer(Quantity.class, quantitySerializer);

呃,这有多丑陋?但这是我能找到的唯一让它工作的方法之一,我不得不经历更多的体操来删除警告。

当然,与SimpleModule.addDeserializer()类似,SimpleModule.addSerializer()在其泛型参数上也可以更灵活一些

我之所以在这里报告这一点,是因为Jackson项目说要在这里报告错误-我也在寻求更好的解决办法。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-06-27 11:33:34

SimpleModule中有一个重载版本的addSerializer()

代码语言:javascript
复制
public SimpleModule addSerializer(JsonSerializer<?> ser)

这使得它可以工作:

代码语言:javascript
复制
module.addSerializer(new MyQuantityJsonSerializer());

只要您将序列化程序定义为:

代码语言:javascript
复制
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...
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42723846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档