Java 在序列化时保留类型信息,并相应地取消序列化

Java 在序列化时保留类型信息,并相应地取消序列化,java,jackson,Java,Jackson,我被困在一个用例中,我有一个类a的对象,比如说a,和一个类B的对象,比如说B,B intern有一个类C的子类的成员变量,比如说C。 我的用例是,我想序列化/反序列化一个对象,以便在序列化时向成员c添加一个类型变量,当对象属于子类时,我可以使用该类型变量进行识别。我正试图通过杰克逊做到这一点。请参阅以下代码: A类{ B B; } B类{ C C; } C类{ } D类扩展了C类{ INTA; } E类扩展了C类{ b串; } 当我有C=new D(),B=new B(C),A=new A(B

我被困在一个用例中,我有一个类a的对象,比如说a,和一个类B的对象,比如说B,B intern有一个类C的子类的成员变量,比如说C。 我的用例是,我想序列化/反序列化一个对象,以便在序列化时向成员c添加一个类型变量,当对象属于子类时,我可以使用该类型变量进行识别。我正试图通过杰克逊做到这一点。请参阅以下代码:

A类{
B B;
}
B类{
C C;
}
C类{
}
D类扩展了C类{
INTA;
}
E类扩展了C类{
b串;
}
当我有C=new D(),B=new B(C),A=new A(B)时应为:

试试avro(或一些第三方库)

试试avro(或一些第三方库)


感谢所有的回复,我可以使用@jb nizet的答案,使用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”)}
抽象类CMixIn{
}
下面是我如何使用mixIn类:

private ObjectMapper ObjectMapper=new ObjectMapper().addMixIn(C.class,CMixIn.class);
现在要序列化类a的对象:

String serializedString=objectMapper.writeValueAsString(a);
要反序列化上述字符串,请执行以下操作:

objectMapper.readValue(serializedString,A.class);

感谢所有的回复,我可以使用@jb nizet的答案,使用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”)}
抽象类CMixIn{
}
下面是我如何使用mixIn类:

private ObjectMapper ObjectMapper=new ObjectMapper().addMixIn(C.class,CMixIn.class);
现在要序列化类a的对象:

String serializedString=objectMapper.writeValueAsString(a);
要反序列化上述字符串,请执行以下操作:

objectMapper.readValue(serializedString,A.class);

问题的标题与正文有什么关系?选择正确的标题。抱歉,谢谢你的回答。你的问题的标题与正文有什么关系?请选择正确的标题。完成了,很抱歉,谢谢你的回答。谢谢你的回答,但我还是继续使用了jackson mixIn功能。谢谢你的回答,但我继续使用了jackson mixIn功能。
"A":{
    "B":{
        "type":D
        "C":c
    }
}