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に変更してみreturn objectMapper.readValue(cachedData.getData(), objectMapper.getTypeFactory().constructType(typeReference))
ましたが、同じ問題が発生しています。
型をシリアライザーに渡す方法に関するものだと確信していますが、これまでのところ修正できていません。ありがとう。