3

この例外は、ProtoBuf でシリアル化するためのテスト アプリケーションでスローされています。

SceneryFile:temp.ad2
ProtoBuf.ProtoException: Possible recursion detected (offset: 2 level(s): SceneryFile: temp.ad2
at ProtoBuf.ProtoWriter.CheckRecursionStackAndPush(Object instance( in c:\protbuf-net\protobuf-net\ProtoWriter.sc:line321

これらの他の質問を見つけました

protobuf-net: 再帰の可能性が検出されました

Protobuf-net の再帰の可能性が検出されました: 子と親をシリアル化します

ツリーの深さはわずか 4 です。変更できるかどうかを調べましたProtoBuf.ProtoWriter.RecursionCheckDepth が、コードでそれを行う方法が見つかりませんでした。

最後の質問に対する Marc の回答に基づいて、参照によって同じオブジェクト インスタンスが再度参照されていることを意味していると思います。つまり、私の場合、SceneryFile はそれ自体を参照しているか、別の場所で参照されています (実際には基本クラスです)。これは、すべての直接の子がそれへの参照を保持しているという意味です。ここでの答えは、これが問題である可能性があることを示唆しているようです:

上記の 2 番目の質問の調査結果に基づいて、親をシリアル化から削除したところ、この問題は停止しました。

シリアライゼーションのように親への参照を保持できるようにする方法はありますか、それとも親にインデックスを使用し、逆コンパイル時にグラフを再構築する必要がありますか?

ありがとう

4

1 に答える 1

3

「再帰チェックの深さ」は最適化の詳細のみです。再帰のためにすべてのオブジェクトを常にチェックするオーバーヘッドを回避するために、深さがこれよりも高いかどうかのみをチェックします。何が有効かどうかに違いはありません。

ここには 2 つのアプローチがあります。私が好むのは、「子」の関係をシリアル化し、逆シリアル化後のコールバックを使用して、子をループし、その親プロパティを設定することです。これはコールバック属性を介して行われ、通常は 5 行程度のコードです。

もう 1 つは、参照を尊重するように protobuf-net に指示することです (メンバーで AsReference を true に設定します)。これによりレイアウトが変更され、別の (protobuf-net 以外の) 実装と相互運用する場合は不適切になります。

両方の ir の例を追加できますが、電話ではできません!

于 2012-10-23T16:08:52.273 に答える