关于带有循环引用的数据序列化的概念性问题
我正在尝试在Python中实现一个序列化器,想要做到的事情大概是这样的。
假设有一个对象Foo,它里面有一个指向Bar的引用,那么这个序列化器会把Foo里的所有数据都提取出来,同时把这个引用转换成Bar的数据。这个过程会递归进行,也就是说如果里面还有其他对象,它们也会被一层一层地提取出来,直到所有的数据都处理完。
不过,我在这个方法上遇到了一个问题,那就是循环引用。比如说,Foo引用了Bar,而Bar又引用了Foo,这样就会导致无限递归,程序就会一直在循环中,永远也停不下来。
那么,有什么方法可以解决这个问题呢?
注意:我无法控制要序列化的数据,所以不能排除循环引用的情况。
3 个回答
1
了解一下Python的pickle模块,这个模块可以自动处理循环引用的问题,方法是通过序列化来实现。它使用对象的ID来存储引用。想查看Python 2.6.6的源代码,可以在这里找到。
2
提前把结构“扁平化”,也就是用一种叫做深度优先搜索的方法,记录下你见过哪些项目。给每个对象分配一个编号,然后把对象的引用替换成这个编号的引用。
(简单来说,就是把它变成一个图。)
1
保持一个你已经处理过的对象列表。每次你想要处理一个对象时,都应该先检查一下这个对象是否在列表里。还有一种类似的方法是,在每个对象内部设置一个布尔值,表示这个对象是否已经被处理过,如果是的话,就不再继续处理这个对象了。