2011-10-24 15 views
2

同じオブジェクトが複数のパスで参照されるオブジェクトグラフをシリアライズするためにバイナリフォーマッタを使用しています。しかし、シリアライゼーション中に、特定のオブジェクトのGetObjectDataが何度も呼び出されます。簡単なオブジェクトを使ってテストサンプルを試してみると、それはオブジェクトグラフで発生する回数とは関係なく一度だけ呼び出されます。同じオブジェクトが複数回訪問され、シリアル化中に.GetObjectデータがSerializableオブジェクトで呼び出される理由はありますか?これが起こると、逆シリアル化はFixUpエラーで失敗するようです。.NETバイナリフォーマッタがGetObjectDataを複数回呼び出す理由はありますか?

+0

あなたのコードを教えてもらえますか?あなたはただ1つのオブジェクトグラフをシリアライズしていますか?つまり、 'Serialize()'を一度呼び出すだけですか? "FixUpエラー"とは何ですか? – svick

+0

コードベースが共有するのはかなり巨大であることをお詫び申し上げます。シリアライズされているオブジェクトではなく、他のオブジェクトと問題のオブジェクトタイプを持つハッシュテーブルは、複数のパスから参照される可能性があります。逆シリアル化中にスローされた例外は、 "System.Runtime.Serialization.SerializationException:ID 91のオブジェクトがフィックスアップで参照されましたが、存在しません。" – sraj

+0

私はコードベース全体を共有するように求めていません。しかし、問題を再現するために使用できるコードを共有できますか? – svick

答えて

3

問題と解決方法が見つかりました。 .NETのバグだった。循環参照があり、サロゲートが使用されている場合、直列化復元中に問題が発生する可能性があります。内部直列化サロゲートをFormatterServices.GetSurrogateForCyclicalReference()でラップすることを修正しました。現在は動作しているようですが、その他の問題を除外するために、より多くのユースケースを試していきます。誰かを助け、時間を節約できることを願っています。

関連する問題