讓我回到麻煩的根源。 因爲我有同樣的問題。
我意識到,問題沒有在GetHashCode方法中找到,而是在Equals-method中找到。
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」 - 方法? 我將得到一個InvalidOperationException與消息在序列化T類型的對象時檢測到循環引用。
在進行serilization時,XmlSerializer會嘗試避免將相同的對象作爲子項添加到XML文檔中,因爲這會導致出現一個圓圈。 但是,檢查「這是同一個對象」的方法是使用GetHashCode-method和Equals-method來設計它們的目的 - 檢查對象的相等性。
在我們的例子中,這些對象migth是不同的實例,而XmlSerializer不檢查「內存中的實例」,而是使用它所知道的方法--GetHashCode和Equals。
所以,想想你如何實現你的等號方法
或者更好的...
想想如何改進你的類和方法的實施,以避免這個問題,在根的麻煩。 ;-)
在序列化開始/結束時,OnSerializing和OnSerialized屬性可以幫助設置標誌和禁用/啓用方法行爲,但對於WebMethods結果SOAP/Xml序列化程序無效。 – alpav 2011-12-22 21:46:50
你能舉一個簡單的例子來說明問題嗎?請包括導致問題的'Equals'和'GetHashCode'實現。 – 2011-12-23 04:18:53
另外,如果您使用的是ASMX Web服務,那麼'[Serializable]'完全不重要。 – 2011-12-23 04:19:21