在一个用例中,我有一个类A的对象说a,一个类B的对象说b,b实习生有一个类C的子类的成员变量说c。 我的用例是我要对a进行序列化/反序列化,以便在序列化时向成员c添加一个类型变量,利用该变量可以识别对象所属的子类。我正在尝试通过杰克逊实现这一目标。请参考下面的代码:
Class A{
B b;
}
Class B{
C c;
}
Class C {
}
Class D extends C{
int a;
}
Class E extends C{
string b;
}
当我有C c =新的D(),B b =新的B(c),A =新的A(b)时期望:
"A":{
"B":{
"type":D
"C":c
}
}
答案 0 :(得分:0)
尝试使用Avro(或某些第三方库)吗?
https://docs.oracle.com/database/nosql-12.1.3.0/GettingStartedGuide/avroschemas.html
答案 1 :(得分:0)
感谢所有我能够使用@ son-JizenInfo的答案,使用JsonTypeInfo和JsonSubTypes。 这是我使用的注释:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
@JsonSubTypes.Type(value = E.class, name = "E")})
因为由于所有权原因我无法编辑类C,所以将它与mixIn类一起使用。这是我的创建方式:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = D.class, name = "D"),
@JsonSubTypes.Type(value = E.class, name = "E")})
abstract class CMixIn {
}
这是我使用mixIn类的方式:
private ObjectMapper objectMapper = new ObjectMapper().addMixIn(C.class, CMixIn.class);
现在要序列化类A的对象a:
String serializedString = objectMapper.writeValueAsString(a);
要反序列化上面的字符串:
objectMapper.readValue(serializedString, A.class);