java - Jackson 模块签名阻止为自引用泛型类型添加序列化程序

标签 java generics jackson jsr363

我想为 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>> .如果不在模块方法中引入一些任意的通用变量并使用杂技 Actor ,就没有简单的 Actor 阵容。即使这样也行不通:

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 项目说要在这里报告错误 --- 我还要求更好的解决方法。谢谢。

最佳答案

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...
    }
}

关于java - Jackson 模块签名阻止为自引用泛型类型添加序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723846/

相关文章:

java - 如何将 Calendar 对象设置为当前日期,但包含 HH :mm:ss 的 SimpleDateFormat 中的时间

c#获取泛型类中泛型类型参数的名称

java - 如何使用 Jackson 全局定义命名约定

java - Neo4j Cypher 结果为 JSON : Getting JsonMappingException when using JsonHelper. createJsonFrom() 但仅限于某些查询

java - Android:如何将现有 JSONObject 添加到现有 key

java - ArrayList 中不支持的异常

java - OOP:如何编写能够一起工作的类族?

java - 无法访问 ArrayList 的 ArrayList(通用)

java - Jackson 枚举序列化和反序列化

java - 如何使用 intellij IDEA 12 创建 Maven Web 应用程序?