我必须将非常复杂的类序列化为JSON。序列化失败并出现堆栈溢出。这是一个已知的问题-如果有循环引用,则序列化将失败。最简单的情况:对象A保留对对象B的引用,而对象B保留对A的引用。
不幸的是,要序列化的对象太复杂了(每个序列超过100个字段),并且几乎不可能通过代码审查来找到这种依赖关系。 Gson仅记录堆栈溢出异常,没有其他信息。
有什么方法可以检测周期?
答案 0 :(得分:0)
这取决于情况。如果循环引用是由错误引起的,或者仅在少数情况下发生,我将尝试解决特定情况。
如果这种情况很普遍,那么带有循环的对象图可能会经常发生,而这只是检测它们的问题,那么可能有必要尝试基于反射实现自定义解决方案(以获取对象图中所有类的字段,以及它们的值),并将引用类型的值存储在IdentityHashMap中以检测重新访问的对象。
有关使用身份哈希映射检测循环引用的其他讨论,请参见this post。
答案 1 :(得分:0)
一个简单的DFS算法就可以解决问题
visiting
和visited
。visiting
中
visited
中
visiting
visiting
删除当前节点,并将其添加到visited