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

2025-11-03 729 views
3

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

1.18,这里描述不准确抱歉,ClassA中成员变量为Object类型,放的是ClassB的对象

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

回答

8

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

3

能提供重现问题的testcase么?

3

好的。 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;
}

} }

7

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