对象序列化时重复对象的问题解决

参考贴:

https://blog.csdn.net/z714359830/article/details/51527066

 

使用的阿里的fastjson,其实不限于这个工具,其他序列化json的工具也是如此的。上面帖子最后说的我贴出来,比较受用:

关闭FastJson的引用检测(不推荐)

1
JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。

避免重复引用序列化时显示$ref

  1. 在编码时,使用新对象为集合或对象赋值,而非使用同一对象
    不要在多处引用同一个对象,这可以说是一种java编码规范,需要时刻注意。
  2. 不要关闭FastJson的引用检测来避免显示$ref
    引用检测是FastJson提供的一种避免运行时异常的优良机制,如果为了避免在重复引用时显示$ref而关闭它,会有很大可能导致循环引用时发生StackOverflowError异常。这也是FastJson默认开启引用检测的原因。

避免重复/循环引用的正确姿势(推荐)

  1. 重复引用

    1
    2
    3
    4
    5
    6
    7
    8
    
    List<Object> list = new ArrayList<>();
    Object obj = new Object();
    list.add(obj);
    // 创建新的对象
    Object newObj = new Object();
    // 使用org.springframework.beans.BeanUtils复制属性值,我这里用的spring5.0,和帖子里的BeansUtils不同,
    //我这里改成了spring5的BeanUtils
    BeanUtils.copyProperties(obj, newObj);
    list.add(obj);
    
  2. 循环引用
    循环引用这种逻辑本身就不合理,需要在编码时注意避免,这是逻辑错误而非编码技巧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值