1

我想使用 canDeserialize 方法,因为在反序列化时我想获取类型类以在自定义反序列化时应用,如下一个示例:

    public T deserialize(byte[] bytes) throws SerializationException {
       bolean isAccount = this.objectMapper.canDeserialize(??????).
           T t = null;

          if(isAccount)
            t = (T)this.objectMapper.readValue(bytes,Account.class);

          else 
            t = (T) this.objectMapper.readValue(bytes, 0, bytes.length, new TypeReference<Object>(){});

         return t;
    }

在这种情况下,Account 类有注释@JsonDeserialize用于自定义反序列化。

4

1 回答 1

6

要直接回答您的问题,这是您使用该canDeserialize方法的方式:

final ObjectMapper mapper = new ObjectMapper();
mapper.canDeserialize(mapper.constructType(Bean.class));

Bean要检查的 Java 类的名称在哪里。

但是等等,你正试图解决错误的问题。您正在为您的方法的逻辑而苦苦挣扎,因为它的设计不正确。您确实对 Java 运行时(和 Jackson 库)提出了太多要求,试图让它们推断出有关要实例化的类型的所有必需信息(基于参数化返回)。为了解决这个问题,您应该将表示要反序列化的类型的类作为方法的参数包含在内,从而大大简化逻辑:

public <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException,
      JsonProcessingException {
   return new ObjectMapper().readValue(bytes, clazz);
}

此时您可能已经意识到,上面的方法除了ObjectMapper.readValue直接调用之外没有提供额外的功能,所以……就这样做吧!无需定义自定义方法,只需使用ObjectMapper即可。请记住,您不需要做任何明确的事情来触发类的自定义反序列化。Jackson 运行时会自动检测类何时具有自定义反序列化器并调用它。

于 2013-05-28T13:39:33.917 回答