我正在尝试在 python 中实现一个序列化程序,它试图做这样的事情。
如果对象 Foo 具有对 Bar 的前向引用,则序列化程序将转储 Foo 中的所有数据,并将该引用转换为 Bar 的数据转储。对于任意深度,事情都会像这样递归地完成。
但是我在使用这种方法时遇到了一个问题,即循环引用,如果 Foo 引用 Bar 和 Bar 引用 Foo 怎么办?然后将创建无限递归。
有什么方法可以解决这个问题。
注意:我无法控制要序列化的数据,因此不能排除循环引用。
我正在尝试在 python 中实现一个序列化程序,它试图做这样的事情。
如果对象 Foo 具有对 Bar 的前向引用,则序列化程序将转储 Foo 中的所有数据,并将该引用转换为 Bar 的数据转储。对于任意深度,事情都会像这样递归地完成。
但是我在使用这种方法时遇到了一个问题,即循环引用,如果 Foo 引用 Bar 和 Bar 引用 Foo 怎么办?然后将创建无限递归。
有什么方法可以解决这个问题。
注意:我无法控制要序列化的数据,因此不能排除循环引用。
使用深度优先搜索预先展平结构,记录它看到的项目。为每个对象分配一个 id 并用 id 引用替换对象引用。
(本质上,把它变成一个图表。)
研究通过序列化自动处理循环引用的 Python pickle 模块。它使用对象 ID 来存储引用。 Python 2.6.6 的源代码在这里。
保留您已经序列化的对象列表。您尝试序列化的每个对象都应对照此列表进行检查。一个类似的方法是在每个对象中切换一个布尔值,以确定它是否已经被序列化,因此不会继续这个对象。