fastjson循环引用反序列化时的问题

发布于 2021-12-02 22:44:39 字数 2998 浏览 877 评论 8

在使用fastjson时(版本1.2.16),发现循环引用一旦涉及到继承时,反序列化会出现问题(正向序列化没问题):
循环引用部分将无法反序列化回子类对象。

下面列出我的测试类:

一共有三个类,Node,Area,Room;其中Area与Room直接继承自Node。


public class Node {
    protected String name;
    protected Node parent;
    protected List<Node> children = new ArrayList<>();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Node getParent() {
        return parent;
    }
    public void setParent(Node parent) {
        this.parent = parent;
    }
    public List<Node> getChildren() {
        return children;
    }
    public void setChildren(List<Node> children) {
        this.children = children;
    }
}


public class Area extends Node{

}

public class Room extends Node{

}

1.不涉及继承的测试(结果正确)
我建立一个三层节点,结构如下

Node0
|
Node1-------------
|                 |
Node2_1          Node2_2

Node2_1 的Json序列化的结果为:

{
    "@type":"com.Ace.Example.JsonRefExample.Node",
    "children":[],
    "name":"Node2_1",
    "parent":{
        "children":[
            {"$ref":"$"},
            {
                "children":[],
                "name":"Node2_2",
                "parent":{"$ref":"$.parent"}
            }
        ],
        "name":"Node1",
        "parent":{
            "children":[
                {"$ref":"$.parent"}
            ],
            "name":"Node0"
        }
    }
}

把这个结果反序列化为Node,结果是正确的,Node的Parent的Parent的Children有正确数据,是Node1。

2.涉及继承的测试(结果错误)
当三层结构使用子类时,反序列化会有问题,

Area0
|
Area1-----------------
|                    |
Room2_1              Room2_2

Room2_1 的Json序列化的结果为:

{
    "@type":"com.Ace.Example.JsonRefExample.Room",
    "children":[],
    "name":"Room2_1",
    "parent":{
        "@type":"com.Ace.Example.JsonRefExample.Area",
        "children":[
            {"$ref":"$"},
            {
                "@type":"com.Ace.Example.JsonRefExample.Room",
                "children":[],
                "name":"Room_2",
                "parent":{"$ref":"$.parent"}
            }
        ],
        "name":"Area1",
        "parent":{
            "@type":"com.Ace.Example.JsonRefExample.Area",
            "children":[
                {"$ref":"$.parent"}
            ],
            "name":"Area0"
        }
    }
}

把这个结果反序列化为Room,结果错误,Room的Parent的Parent的Children为空,期望的结果应为Area1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

本宫微胖 2021-12-04 00:22:30

虽然size=1,但是每个属性的值是null。我的结果见上图

@我不说话

天涯离梦残月幽梦 2021-12-04 00:17:41

SerializerFeature.PrettyFormat 去掉这个

恋你朝朝暮暮 2021-12-04 00:12:09

这是我的测试代码

@Test
 public void NodeTest3(){
 Area area0 = new Area();
 area0.setName("Area0");
 
 Area area1 = new Area();
 area1.setName("Area1");
 
 Room room21 = new Room();
 room21.setName("Room2_1");
 
 Room room22 = new Room();
 room22.setName("Room_2");
 
 
 AddToParent(area0,area1); 
 AddToParent(area1,room21);
 AddToParent(area1,room22);
 
 String json = JSON.toJSONString(room21,SerializerFeature.WriteClassName,SerializerFeature.PrettyFormat);
 
 Node node = (Node) JSON.parse(json);
 
 System.out.println(json);
 }
 
 public void AddToParent(Node p,Node c) {
 p.getChildren().add(c);
 c.parent = p;
 }  

这是结果:

沦落红尘 2021-12-03 23:20:13

我测了很多次都是这样。 要不你截个图我看你的结果。

伴我心暖 2021-12-03 23:05:04

我试的没问题啊,你代码写的有问题吧

千笙结 2021-12-03 22:46:38

1.2.18会解决这个问题

风透绣罗衣 2021-12-03 16:51:37

@我不说话

确实去掉就好了

不过真的很奇怪,如果不用继承类,只用Node是OK的

以下代码OK

@Test
	public void NodeTest(){
		Node node0 = new Node();
		node0.setName("Node0");
		
		Node node1 = new Node();
		node1.setName("Node1");
		
		Node node21 = new Node();
		node21.setName("Node2_1");
		
		Node node22 = new Node();
		node22.setName("Node2_2");
		
		
		AddToParent(node0,node1);		
		AddToParent(node1,node21);
		AddToParent(node1,node22);
		
		String json = JSON.toJSONString(node21,SerializerFeature.WriteClassName,SerializerFeature.PrettyFormat);
		
		Node node = (Node) JSON.parse(json);
		
		System.out.println(json);
	}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文