2011-03-24 30 views
1

我想在python中實現一個序列化程序,它試圖執行類似這樣的操作。有關通過循環引用序列化數據的概念性問題

如果有一個對象Foo,對Bar有前向引用,序列化程序會將所有數據轉儲到Foo中,並且該引用將被轉換爲Bar的數據轉儲。對於任意的深度,事情都會以這種遞歸方式完成。

但是我遇到了一個問題,那就是循環引用,如果Foo引用Bar和Bar引用Foo會怎麼樣?然後會創建一個無限遞歸。

解決這個問題的方法有哪些。

注意:我無法控制要序列化的數據,所以我不能排除循環引用。

+3

你可以保留你已經序列化的對象列表嗎?您嘗試序列化的每個對象都應根據此列表進行檢查。類似的方法是在每個對象中切換一個布爾值,以確定它是否已經被序列化了,因此不會繼續這個對象。 – chrisaycock 2011-03-24 19:35:47

+0

+1。我正在考慮一些複雜的方法,而最好的解決方案非常簡單。謝謝! – 2011-03-25 12:54:06

+0

很高興你喜歡它。我已將我的評論轉貼爲[答案](http://stackoverflow.com/questions/5424456/conceptual-question-on-serializing-data-with-circular-references/5433251#5433251)。 – chrisaycock 2011-03-25 13:41:55

回答

1

保留已經序列化的對象列表。您嘗試序列化的每個對象都應根據此列表進行檢查。類似的方法是在每個對象中切換一個布爾值,以確定它是否已經被序列化了,因此不會繼續這個對象。

2

先用深度優先搜索平坦化結構,記錄它已經看到的項目。爲每個對象分配一個id並用ID引用替換對象引用。

(從本質上說,把它變成一個曲線圖。)