我想在保留泛型類型的同時對泛型類的實例進行序列化,因此我將能夠稍後反序列化它,而無需手動指定泛型類型。如何動態反序列化具有多個T的泛型類
據我所知,解串通用對象的常用方法是使用類型的引用或JavaType
對象是這樣的:
ObjectMapper om = new ObjectMapper();
ObjectReader or = om.reader();
ObjectWriter ow = om.writer();
String json = "[1, 2, 3]"
JavaType listType = or.getTypeFactory()
.constructParametricType(List.class, Integer.class);
List<Integer> integers = or.forType(listType).readValue(json)
但我不知道(在這種情況下Integer
)泛型類型事前,所以我不能這樣做。
我也明白,由於刪除,我必須以某種方式在序列化的JSON中包含類型信息。這可以通過@JsonTypeInfo
註釋來完成:
class Pojo<T> {
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public T value;
}
然而,如果該類型T
其他各種地方使用這個方法很快就會臃腫。考慮下面的例子:
class Pojo<T> {
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public T value;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public List<T> otherStuff;
// constructor
}
// ...
Pojo<BigDecimal> pojo = new Pojo<>(
BigDecimal.valueOf(42),
Lists.newArrayList(BigDecimal.valueOf(14), BigDecimal.valueOf(23))
);
final String json = ow.writeValueAsString(pojo);
System.out.println(json);
產生以下結果:
{
"value": ["java.math.BigDecimal", 42],
"otherStuff":[
["java.math.BigDecimal", 14],
["java.math.BigDecimal", 23]
]
}
其重複的類型,在BigDecimal
這種情況下,爲每一個對象。這是不必要的,因爲無論如何,T
的所有發生類型都是相同的(除了在某些多態的情況下,我想)。
如果省略爲otherStuff
的@JsonTypeInfo
註釋,傑克遜不能推遲的otherStuff
內容從value
類型的類型。在這個例子中,即使value
是BigDecimal
類型,它也會將otherStuff
反序列化爲List<Integer>
。
如何序列化泛型類的實例,以便我可以安全地反序列化它們並保留泛型參數?