我正在编写一个使用 Jackson 来序列化/反序列化对象的类。在编译时,我不知道要序列化/反序列化的对象的类型。
我阅读了几篇有关 TypeReference
和 TypeFactory
用法的文章和问题,但我仍然遇到一些问题。
我的类看起来像(删除了一些不相关的代码):
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))
,但我遇到了同样的问题。
我很确定这与我将类型传递到序列化器的方式有关,但到目前为止我还无法修复它。谢谢。
最佳答案
目前还不太清楚您到底想要做什么:大部分代码都没有进行更改。具体来说,TypeReference
的用法是错误的:您不能使用类型变量,类型必须是具体的。
但是,也许解决方案比您想象的更简单。如果您可以跟踪原始Class
,只需存储它(或来自clazz.getName()
的名称),并在反序列化时传递它。
关于java - Jackson - 反序列化为运行时指定的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355742/