问题描述

使用gson库将实体对象序列化为json字符串时,出现StackOverflowError异常。如图:

经过排查,发现问题出在循环依赖上。简化版示例代码如下

public class A {private String name;private B b;public A(String name) {this.b = new B(this);this.name = name;}//省略set,get
}
public class B {private A a;public B(A a) {this.a = a;}//省略set,get

测试代码:

public class Test {public static void main(String[] args) {A a = new A("A");System.out.println(a.getName());System.out.println(JsonUtil.toJson(a));}
}

输出结果:

可以看到,实例化对象没有问题,也成功执行了a.getName()方法,但是最后序列化json字符串的时候栈溢出了。
gson不支持这种循环依赖对象的序列化。那么怎么解决这个问题呢?

解决方案

  1. 解除循环依赖。即不要让实体对象太过复杂,特别要避免循环引用。
  2. 使用transient 关键字修饰有循环依赖的字段,gson序列化的时候会直接跳过transient关键字修饰的字段。示例:

    输出结果:

gson序列化抛出StackOverflowError异常相关推荐

  1. 获取线程中抛出的异常信息

    1 ScheduledExecutorService service = Executors.newScheduledThreadPool(10); 2 // 从现在开始delay毫秒之后,每隔一天执 ...

  2. springboot springmvc 抛出全局异常解决方法

    springboot springmvc 抛出全局异常解决方法 参考文章: (1)springboot springmvc 抛出全局异常解决方法 (2)https://www.cnblogs.com/ ...

  3. Java中主线程如何捕获子线程抛出的异常

    Java中主线程如何捕获子线程抛出的异常 参考文章: (1)Java中主线程如何捕获子线程抛出的异常 (2)https://www.cnblogs.com/jpfss/p/10272885.html ...

  4. druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索

    druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索 参考文章: (1)druid抛出的异常------jav ...

  5. 第8集析构函数中抛出的异常

    前两篇文章讨论了对象在构造过程中(构造函数)和运行过程中(成员函数)出现异常时的处理情况,本文将讨论最后一种情况,当异常发生在对象的析构销毁过程中时,又会有什么不同呢?主人公阿愚在此可以非常有把握地告 ...

  6. 第7集 构造函数中抛出的异常

    上一篇文章简单讨论了一下对象的成员函数抛出异常时的处理情况.本文中将继续讨论当在构造函数中抛出异常时,程序的执行情况又如何?这有点复杂呀!而且主人公阿愚还觉得这蛮有点意思! 构造函数中抛出的异常 1. ...

  7. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )

    文章目录 I 异常处理 II 字符串异常 III 异常对象 IV 抛出任意类型对象 V 自定义异常 VI 异常相关代码 I 异常处理 1. 异常处理 : 使用 " try{}catch(){ ...

  8. java exception e抛异常_抛出的异常在上层catch到,但是e.getMessage()为NULL,为什么会这样?...

    1.在一个代码里catch到Exception,throw new Exception(e.getMessage()); 在上级代码里catch到抛出的Exception,想得到错误的信息,结果发现e ...

  9. Spring-AOP @AspectJ进阶之绑定抛出的异常

    文章目录 概述 实例 总结 概述 和通过切点函数绑定连接点信息不同,连接点抛出的异常必须使用AfterThrowing注解的throwing成员进行绑定 实例 代码已托管到Github-> ht ...

最新文章

  1. 【青少年编程】【三级】换装
  2. python3.5下载-Python3.5.2
  3. 用户设置个人资料时,是否需要一个清空选项?
  4. git - 搭建最简单的git server
  5. python 字符串替换_学完Python打算出去找工作,怕找不到?看完这篇你可以提高通过率...
  6. 关于区块链,程序员需要了解什么
  7. java 导出es数据_elasticseach 数据的导出与导出工具elasticdump使用
  8. js深入研究之神奇的匿名函数类生成方式
  9. Node.js+windows
  10. T5:Exploring the Limits of Transfer Learning with a UnifiedText-to-Text Transformer
  11. vc写的工程源代码打包工具
  12. 决战平安京选择正确的服务器,决战!平安京怎么预先选择自己的位置 匹配预选位流程攻略...
  13. 淘宝鹊桥计算工具安卓版小程序
  14. 水文预报 求各个年份的纳什效率系数
  15. 有道词典java下载手机版下载手机版_有道词典app下载_有道词典在线翻译下载安装手机版v9.08...
  16. 新媒体如何借势进行热点营销
  17. 学习笔记(41):决胜AI-深度学习系列实战150讲-完成预测分类任务
  18. 硫化氢探针|H2S荧光探针|hydrogen sulfide荧光探针的结构式
  19. 记一次IE9下数据请求description:拒绝访问的坑
  20. Windows10磁盘图标感叹号,Bitlocker提示等待激活

热门文章

  1. Response status code does not indicate success: 401 (Unauthorized).
  2. UE4蓝图之函数、事件、宏的区别
  3. NOTEBOOK_1电子元器件
  4. python 类属性
  5. window.history.pushState()和window.history.replaceState()
  6. RSA加密算法原理及其Java实现
  7. 【QML学习8】鼠标与触摸处理
  8. 观《人造韩寒:一场关于“公民”的闹剧》后感
  9. 家庭创意:春节寻宝习俗
  10. Matlab2016b 下载显示【弹出dvd1并插入dvd2以继续】解决