0

我遇到了无法反序列化其中具有哈希图定义的类的问题。

我的班级定义如下:

   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。

4

0 回答 0