fastjson循环引用反序列化时的问题
在使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
虽然size=1,但是每个属性的值是null。我的结果见上图
@我不说话
SerializerFeature.PrettyFormat 去掉这个
这是我的测试代码
这是结果:
我测了很多次都是这样。 要不你截个图我看你的结果。
我试的没问题啊,你代码写的有问题吧
1.2.18会解决这个问题
@我不说话
确实去掉就好了
不过真的很奇怪,如果不用继承类,只用Node是OK的
以下代码OK