私はトラブルの根底に下ろしましょう。 私は同じ問題があったので。
私は、問題がGetHashCodeメソッドではなくEqualsメソッドで見つかったことを認識しました。
XmlSerializerがその種の例外をスローする最も重要な理由は、XMLドキュメントの構造とXmlSerializer内の「同等メカニズム」のためです。例えば
:
private XmlSerializer serializer;
public void TryToSerialize(TextWriter output)
{
MyObject instance = new MyObject();
instance.Key = 101;
instance.SomeValue = "Some value";
instance.Child = new MyObject();
instance.Child.Key = 101;
instance.Child.SomeValue = "Another value";
serializer.Serialize(output, instance);
}
そして、どのように私は、メソッドGetHashCodeメソッドとequalsメソッドを実装?このよう
:
public overrides int GetHashCode()
{
return this.Key.GetHashCode();
}
public overrides bool Equals(object obj)
{
if(obj == null) return false;
MyObject other = obj as MyObject;
if(other == null) return false;
return this.Key.Equals(other.Key);
}
そして、私は "TryToSerialize" -methodを実行した場合、何が起こるでしょうか? InvalidOperationException、メッセージタイプTのオブジェクトのシリアル化中に循環参照が検出されました。
XmlSerializerは、XMLドキュメントに子オブジェクトと同じオブジェクトを追加しないようにします。これはサークルになるためです。 "これは同じオブジェクトです"をチェックする方法は、GetHashCodeメソッドとEqualsメソッドを使用してオブジェクトの等価性をチェックする方法です。
例では、これらのオブジェクトは異なるインスタンスに移行し、XmlSerializerは「メモリ内のインスタンス」をチェックしませんが、GetHashCodeとEqualsという既知のメソッドを使用します。
だから、あなたはルートにこの問題を回避するために、あなたのクラスやメソッドの実装を改善する方法
は考えて...あなたはは、等しい方法
それとももっと自分の実装方法を考えますトラブルの詳細。 ;-)
OnSerializingおよびOnSerialized属性は、直列化の開始/終了時にフラグを設定し、メソッドの動作を無効または有効にするのに役立ちますが、WebMethodsの結果SOAP/Xmlシリアライザでは機能しません。 – alpav
問題を説明する小さくて簡単な例を教えてください。この問題を引き起こす 'Equals'と' GetHashCode'実装を含めてください。 –
また、ASMX Webサービスを使用している場合、 '[Serializable]'はまったく重要ではありません。 –