我想知道是否可以通过某种方式正确进行以下反序列化:
public class MyClass {
Map<String, Serializable> map;
OtherObject object;
[...]
}
ObjectMapper mapper = new ObjectMapper();
MyClass instance = mapper.readValue(someJson, MyClass);
当前,我正在尝试并遇到异常
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.io.Serializable: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
答案 0 :(得分:0)
您可以将数据类的Map属性声明更改为不引用Serializable:
public class MyClass {
Map<String, ?> map;
OtherObject object;
[...]
}
这也会影响地图的getter和setter的签名。但是,这确实松开了类型检查,并且映射的值可以是Object的任何子类,而不是Serializable的实现。如果这是重要的细节,则可以对地图值进行序列化后验证。
或者您可以配置自定义反序列化程序,如问题注释中所建议的那样。只需要将代码添加到哪里就可以了,这取决于这种情况在您的应用程序中的普及程度。
答案 1 :(得分:0)
从v2.10.0开始,Jackson支持对'Serializable'值进行简单的反序列化,即它将'Serializable'与'Object'相同。 有关更多详细信息,请参见此Github issue。
因此将Jackson升级到2.10.0+并尝试。