jsog-jackson:序列化对象图

jsog-jackson: Serializing object graphs

我正在尝试使用 parent/child 引用序列化一个对象图,本质上我有一个如下所示的实体:

@Entity (name = "Container")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Container {
    public String type = "parent";

    @JsonManagedReference ("child")
    @OneToMany (mappedBy = "parent", cascade = CascadeType.PERSIST)
    public List<Child> children;
}

@Entity (name = "Child")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Child {
    public String type = "child";

    @JsonBackReference ("child")
    @ManyToOne
    public Parent parent;
}

当我尝试将其序列化到客户端时,这就是我得到的:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
        },
        { ... }
    ]
}

我看到所有对象的 @id 属性,但看不到任何 @ref 属性。如果我对 jsog 和 jsog-jackson 的理解是正确的,那么这就是实际应该序列化的内容:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
            @ref: 1
        },
        { ... }
    ]
}

我真正想要的是一种在浏览器中恢复序列化 JSOG 后恢复对父级的原始反向引用的方法,这样我得到的不是 @ref parent 属性 在每个 child 对象返回。

您使用两种相互冲突的方法来管理循环关系。您可以使用 JSOGGenerator @JsonManagedReference 和 @JsonBackReference 注释。

JSOGGenerator 将在 JSON 序列化格式中包含 @id 和 @ref 属性,这对于以另一种语言(例如 JavaScript.

反序列化对象很有用

@JsonManagedReference 和@JsonBackReference 使用 Java class 信息来识别循环引用,随后该信息被排除在 JSON 序列化格式之外,因此另一种语言如 Java脚本无法反序列化对象,因为缺少所需的信息。

JSOGGenerator 的另一个好处是它可以处理深度嵌套的循环关系,而不是有限的父子关系。