fastjson 关于重复引用反序列化为空的问题,请确认一下是否为bug

sirbozc5  于 2021-11-27  发布在  Java
关注(0)|答案(4)|浏览(316)

不贴代码了,看着不清晰
def ClassA ClassB ClassC ClassD
ClassA 中有 ClassB 类型的成员变量

ClassB 中有 List<ClassC> 的成员变量
ClassC 中有 ClassD
序列化对象为一个ClassA中一个ClassB中两个ClassC对象组成的List,两个ClassC对象引用同一个ClassD对象。
这时反序列化,第二个ClassC对象的ClassD成员为null。$ref的结构为$.ClassB.ClassC[0].ClassD。
就是这样,如觉得描述不清晰可以回复,我可以贴代码。

hzbexzde

hzbexzde1#

另:我并不想通过不探测重复/循环引用来解决问题

wecizke3

wecizke32#

能提供重现问题的testcase么?

bxgwgixi

bxgwgixi3#

好的。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.List;

/**

  • Created by PHY on 2018/1/12.

*/
public class Test {

public static void main(String[] args) {

TestA testA = new TestA();
 TestB testB = new TestB();
 testB.setText("jefsf");
 TestB testB1 = new TestB();
 List<TestB> list = new ArrayList<>();
 testA.setB(list);
 testB1.setText("asfssd");
 list.add(testB);
 list.add(testB1);
 TestC testC = new TestC();
 testC.setMade("cao");
 testB.setYouxi(testC);
 testB1.setYouxi(testC);
 CarrierT carrierT = new CarrierT();
 carrierT.setSign(6);
 carrierT.setResponse(testA);
 String res = JSON.toJSONString(carrierT, SerializerFeature.WriteClassName);
 System.out.println(res);
 CarrierT result = JSONObject.parseObject(res, CarrierT.class);
 System.out.println(result.getSign());
 System.out.println(JSON.toJSONString(result));
 for (TestB tmp :
         ((TestA)result.getResponse()).getB()) {
     System.out.println(tmp.getText());
     System.out.println(tmp.getYouxi().getMade());
 }

}

static class TestA {
int a;
List<TestB> b;

TestA() {
     a = 3;
 }

 public int getA() {
     return a;
 }

 public void setA(int a) {
     this.a = a;
 }

 public List<TestB> getB() {
     return b;
 }

 public void setB(List<TestB> b) {
     this.b = b;
 }

}

static class CarrierT {
int sign;
Object response;

public int getSign() {
     return sign;
 }

 public void setSign(int sign) {
     this.sign = sign;
 }

 public Object getResponse() {
     return response;
 }

 public void setResponse(Object response) {
     this.response = response;
 }

}

static class TestB {
String text;
TestC youxi;

public String getText() {
     return text;
 }

 public void setText(String text) {
     this.text = text;
 }

 public TestC getYouxi() {
     return youxi;
 }

 public void setYouxi(TestC youxi) {
     this.youxi = youxi;
 }

}

static class TestC {
String made;

public String getMade() {
     return made;
 }

 public void setMade(String made) {
     this.made = made;
 }

}
}

z18hc3ub

z18hc3ub4#

@wenshao
如果CarriorT的response类型不是Object,而是TestA的话,反序列化是没有问题的,但两种序列化结果一样的,不能反序列化回来我觉得还是有问题的

相关问题