我正在编写一个使用 Jackson 序列化/反序列化对象的类。在编译时,我不知道我将要序列化/反序列化的对象的类型。
我阅读了几篇关于 and 用法的文章和问题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()
方法返回的对象仍然是 a Map
,据我了解是反序列化的默认类。
我也尝试将decode()
方法更改为 return return objectMapper.readValue(cachedData.getData(), objectMapper.getTypeFactory().constructType(typeReference))
,但我遇到了同样的问题。
我很确定这与我将类型传递到序列化程序的方式有关,但到目前为止我还无法修复它。谢谢。