我在寫一個使用傑克遜序列化/反序列化對象的類。在編譯時,我不知道哪個是我要序列化/反序列化的對象的類型。傑克遜 - 反序列化到運行時指定的類
我讀了幾篇有關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))
,但我遇到了同樣的問題。
我很確定這是關於我將類型傳入序列化程序的方式,但至今尚未解決。謝謝。
請參閱http://stackoverflow.com/questions/17400850/is-jackson-really-unable-to-deserialize-json-into-a-generic-type – lisak