我遇到了无法反序列化其中具有哈希图定义的类的问题。
我的班级定义如下:
public class <T extends Serializable> MyClass1 {
private Map<String,List<MyClass2<T>>> entity;
boolean moreData=false;
public Map<String,List<MyClass2<T>>> getEntity() {
return entity;
}
public void setEntity(Map<String,List<MyClass2<T>>> entity) {
this.entity = entity;
}
public boolean isMoreDataAvailable()
{
return moreData;
}
}
序列化类的内容会产生如下输出:
ObjectMapper om = getObjectMapper();
om.writeValueAsString(myclass1inst);
{
"MyClass1" : {
"entity" : {
"java.util.HashMap" : {
"SITE_ADD" : {
"java.util.ArrayList" : [ {
"MyClass2" : {
"priority" : 3,
"groupName" : null,
"payload" : {
"MyClass3" : {
"networkType" : "HIGH_SPEED_LAN",
"nativeSite" : true
}
"groupOrderType" : null,
"entityGuid" : null
}
} ]
}
}
},
"moreDataAvailable" : false
}
}
问题是反序列化对我来说失败了这个例外。
ObjectMapper om = getObjectMapper();
om.readValue(content, MyClass1.class);
2013-06-27 02:55:47,822 [[ACTIVE] 反序列化推送请求时出错:无效类型 id 'SITE_ADD'(对于 id 类型'Id.class'):找不到此类类(通过引用链:MyClass1 [“实体"])
为什么 json 应该认为字符串 site_add 是 Id.class 类型。
在阅读杰克逊 json 文档时,我发现 HashMap 必须注册如下:
http://wiki.fasterxml.com/JacksonInFiveMinutes
映射结果 = mapper.readValue(src, new TypeReference>() { });
我是否必须实现@jsondeserialable来定义自定义反序列化。请给我你的建议。
这是对象初始化的代码
public static ObjectMapper getObjectMapper() {
ObjectMapper om = new ObjectMapper();
// to remove wrapping of root element
om.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);
om.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
// to handle inheritence
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_OBJECT);
// to ignore getters which doesnt have setters
om.configure(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);
// to ignore extra properties during deserialization
om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
return om;
}
在上面的示例中,变量 T 指向 MyClass3。