当前位置: 首页 > 知识库问答 >
问题:

Jackson-反序列化为运行时指定的类

吉和同
2023-03-14

我正在编写一个使用Jackson序列化/反序列化对象的类。在编译时,我不知道要序列化/反序列化的对象是哪种类型。

我的类看起来像(移除了一些不相关的代码):

public class JsonSerializer<T> {

  private ObjectMapper objectMapper;
  private TypeReference typeReference;

  @PostConstruct
  public void init() {
      objectMapper = new ObjectMapper();
      typeReference = new TypeReference<T>(){ };
  }

  // ...


  public Object decode(CachedData cachedData) {
    try {
        return objectMapper.readValue(cachedData.getData(), typeReference);
    } // ...
  }
}

这是我用来测试的代码片段:

public class SerializerTest {

  private JsonSerializer<Clazz> serializer;
  private ObjectMapper objectMapper = new ObjectMapper();
  private static final String CHARSET = "UTF-8";
  private Clazz data = generateData(); // creates a simple object

  @BeforeMethod
  public void beforeMethod() {
      serializer = new JsonSerializer<Clazz>();
      serializer.init();
  }

  // ...

  public void shouldDecodeDataCorrectly() throws Exception {
    CachedData cachedData = new CachedData(0, 
      objectMapper.writeValueAsString(data).getBytes(CHARSET), 
      CachedData.MAX_SIZE);

    Object object = serializer.decode(cachedData);
    assertEquals(data, object);
  }

  public static class Clazz {
    // POJO with getters and setters
  }

}

据我所知,使用TypeReference应该足以让反序列化器知道从字节流读取的值应该放在Clazz对象中。但是,decode()方法返回的对象仍然是map,我理解它是反序列化的默认类。

我还尝试更改decode()方法以返回return ObjectMapper.ReadValue(CachedData.GetData(),ObjectMapper.GetTypeFactory().ConstructType(typeReference)),但我遇到了同样的问题。

我很确定这是关于我将类型传递到序列化器中的方式的问题,但是到目前为止我还没有能够修复它。多谢了。

共有1个答案

姬念
2023-03-14

您到底想做什么还不是很清楚:大部分代码都没有更改。特别是TypeReference的用法是错误的:您不能与它一起使用类型变量,类型必须是具体的。

然而,也许解决方案比你想象的要简单。如果您能够跟踪原始的,只需存储它(或clazz.getName()中的名称),并在反序列化时传递它。

 类似资料:
  • 像这样: 我该怎么办?

  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 但这只有在保证先设置start的情况下才起作用。

  • 我有下面的课: 我希望它从Jackson处理的以下JSON中反序列化。 jackson-datatype-joda(https://github.com/fasterxml/jackson-datatype-joda) 自定义序列化程序(公共类JodaDateTimeJsonSerializer扩展JsonSerializer{...}-Spring@ResponseBody Jackson Js

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器

  • 我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化