有什么方法可以找到循环引用?

时间:2019-06-16 14:02:31

标签: java gson

我必须将非常复杂的类序列化为JSON。序列化失败并出现堆栈溢出。这是一个已知的问题-如果有循环引用,则序列化将失败。最简单的情况:对象A保留对对象B的引用,而对象B保留对A的引用。

不幸的是,要序列化的对象太复杂了(每个序列超过100个字段),并且几乎不可能通过代码审查来找到这种依赖关系。 Gson仅记录堆栈溢出异常,没有其他信息。

有什么方法可以检测周期?

2 个答案:

答案 0 :(得分:0)

这取决于情况。如果循环引用是由错误引起的,或者仅在少数情况下发生,我将尝试解决特定情况。

如果这种情况很普遍,那么带有循环的对象图可能会经常发生,而这只是检测它们的问题,那么可能有必要尝试基于反射实现自定义解决方案(以获取对象图中所有类的字段,以及它们的值),并将引用类型的值存储在IdentityHashMap中以检测重新访问的对象。

有关使用身份哈希映射检测循环引用的其他讨论,请参见this post

答案 1 :(得分:0)

一个简单的DFS算法就可以解决问题

  • 创建2个哈希集:visitingvisited
  • 通过Json求助
    • 如果当前节点位于visiting
      • 打印“找到循环参考”
    • 否则,如果当前节点位于visited
      • 打印“找到交叉”
    • 其他
      • 将当前节点添加到visiting
      • 通过子节点求助
      • visiting删除当前节点,并将其添加到visited