1

このようなことをしようとするシリアライザをPythonで実装しようとしています。

Bar への前方参照を持つオブジェクト Foo がある場合、シリアライザーはすべてのデータを Foo にダンプし、参照は Bar のデータ ダンプに変換されます。任意の深さに対して、このように再帰的に処理が行われます。

しかし、このアプローチで遭遇する問題があります。循環参照の問題です。Foo が Bar を参照し、Bar が Foo を参照するとどうなるでしょうか。その場合、無限再帰が作成されます。

この問題に取り組むためのアプローチは何ですか。

注: シリアル化するデータを制御できないため、循環参照を除外することはできません。

4

3 に答える 3

2

見たアイテムを記録する深さ優先探索を使用して、事前に構造を平坦化します。各オブジェクトにIDを割り当て、オブジェクト参照をID参照に置き換えます。

(本質的には、それをグラフに変換します。)

于 2011-03-24T19:36:01.723 に答える
1

シリアライゼーションによって循環参照を自動的に処理する Python pickle モジュールを調べてください。オブジェクト ID を使用して参照を格納します。 Python 2.6.6 のソース コードはこちらです。

于 2011-03-24T21:46:51.043 に答える
1

既にシリアル化したオブジェクトのリストを保持します。シリアル化しようとするすべてのオブジェクトは、このリストに対してチェックする必要があります。同様のアプローチは、各オブジェクト内でブール値を切り替えて、既にシリアル化されているかどうかを確認することです。したがって、このオブジェクトについては続行しません。

于 2011-03-25T13:41:19.920 に答える