[alibaba/fastjson]关于循环引用的一些问题,不确认到底是不是bug

2025-11-13 468 views
4

Class A{ private FieldClazz1 f1; private FieldClazz2 f2; } ArrayList list = new ArrayList; FieldClazz1 f1_0 = new FieldClazz1 ; FieldClazz2 f2_0 = new FieldClazz2 ; FieldClazz2 f2_1 = new FieldClazz2 ;

list.add(A(f1_0 ,f2_0 )); list.add(A(f1_0 ,f2_1 ));

将list 序列化之后,第二个 对象的 f1 字段 会变成$.data[0].f1 。 我认为这不是循环引用,只能算重复引用。加入‘SerializerFeature.DisableCircularReferenceDetect’ 会解决这个问题。但是如果真的出现循环引用,加入 DisableCircularReferenceDetect 会不会出现问题。

回答

6

这显然不是bug啊,第二个对象的f1确实和第一个对象的f1是同一个引用吧~ 只要你反序列化支持解析这引用形式,那就不是问题吧~ 如果你就是觉得别扭,完全可以在A的构造函数里使用入参的拷贝,而不是引用

6

@vipcxj 嗯嗯,因为我也不确定是循环判断错了,还是就是如果序列化的时候出现相同对象的引用,就采用这样的虚列化方式。 等有空了看看源码。

2

是不是相同引用,都是用==判断的吧,而且java没有操作符重载,所以这点应该没有例外~

3

@vipcxj 我看了源码,源码会在SerialContext 中会有一个类型为identityhashmap 的reference 。当没有disableCircularReferenceDetect 开启这个属性的时候,会在reference 中放入序列化的对象。依据identityhashmap 的特性,序列化是判断是不是含有该引用。如果含有引用,则按照$.data的形式序列化。