我想在python中實現一個序列化程序,它試圖執行類似這樣的操作。有關通過循環引用序列化數據的概念性問題
如果有一個對象Foo,對Bar有前向引用,序列化程序會將所有數據轉儲到Foo中,並且該引用將被轉換爲Bar的數據轉儲。對於任意的深度,事情都會以這種遞歸方式完成。
但是我遇到了一個問題,那就是循環引用,如果Foo引用Bar和Bar引用Foo會怎麼樣?然後會創建一個無限遞歸。
解決這個問題的方法有哪些。
注意:我無法控制要序列化的數據,所以我不能排除循環引用。
我想在python中實現一個序列化程序,它試圖執行類似這樣的操作。有關通過循環引用序列化數據的概念性問題
如果有一個對象Foo,對Bar有前向引用,序列化程序會將所有數據轉儲到Foo中,並且該引用將被轉換爲Bar的數據轉儲。對於任意的深度,事情都會以這種遞歸方式完成。
但是我遇到了一個問題,那就是循環引用,如果Foo引用Bar和Bar引用Foo會怎麼樣?然後會創建一個無限遞歸。
解決這個問題的方法有哪些。
注意:我無法控制要序列化的數據,所以我不能排除循環引用。
保留已經序列化的對象列表。您嘗試序列化的每個對象都應根據此列表進行檢查。類似的方法是在每個對象中切換一個布爾值,以確定它是否已經被序列化了,因此不會繼續這個對象。
先用深度優先搜索平坦化結構,記錄它已經看到的項目。爲每個對象分配一個id並用ID引用替換對象引用。
(從本質上說,把它變成一個曲線圖。)
研究了Python pickle module它通過串行化自動處理circular references。它使用對象標識來存儲引用。 Source code for Python 2.6.6 is here。
你可以保留你已經序列化的對象列表嗎?您嘗試序列化的每個對象都應根據此列表進行檢查。類似的方法是在每個對象中切換一個布爾值,以確定它是否已經被序列化了,因此不會繼續這個對象。 – chrisaycock 2011-03-24 19:35:47
+1。我正在考慮一些複雜的方法,而最好的解決方案非常簡單。謝謝! – 2011-03-25 12:54:06
很高興你喜歡它。我已將我的評論轉貼爲[答案](http://stackoverflow.com/questions/5424456/conceptual-question-on-serializing-data-with-circular-references/5433251#5433251)。 – chrisaycock 2011-03-25 13:41:55