关于使用循环引用序列化数据的概念性问题

时间:2011-03-24 19:29:05

标签: python serialization prototyping

我正在尝试在python中实现一个序列化程序,它试图做这样的事情。

如果有一个对象Foo,具有对Bar的前向引用,则序列化器会将所有数据转储到Foo中,并且引用将转换为Bar的数据转储。对于任何任意深度,事情都会像这样递归地完成。

但是我遇到了这种方法遇到的问题,循环引用的问题,如果Foo引用Bar和Bar引用Foo怎么办?然后会创建无限递归。

解决此问题的方法有哪些。

注意:我无法控制我要序列化的数据,所以我不能排除循环引用。

3 个答案:

答案 0 :(得分:2)

预先将结构展平,使用深度优先搜索记录它所看到的项目。为每个对象分配一个id,并用id引用替换对象引用。

(实质上,将其变成图表。)

答案 1 :(得分:1)

研究通过序列化自动处理pickle module的Python circular references。它使用对象id来存储引用。 Source code for Python 2.6.6 is here

答案 2 :(得分:1)

保留已经序列化的对象列表。应根据此列表检查您尝试序列化的每个对象。类似的方法是在每个对象中切换一个布尔值,看它是否已经被序列化,因此不能继续使用该对象。