2011-02-11 71 views
1

我試圖序列化包含其他成員之間的字典的自定義類型。與字典的鍵和值相關的類型是實現的接口。序列化期間出現StackOverFlowException

字典看起來像

Dictionary<ITypeA, ITypeA> 

TypeA implements ITypeA, 
SubTypeOfA inherits from TypeA 
SubTypeOfB inherits from SubTypeOfA 

僞代碼看起來是這樣的:

  List<Type> knownTypes = new List<Type>() { 
       typeof(TypeA), 
       typeof(SubTypeOfA), 
       typeof(SubTypeOfB) 
      }; 

DataContractSerializer serializer = 
       new DataContractSerializer(typeof(DataHolder), knownTypes); 

      using (FileStream fs = new FileStream(completeFilePath, FileMode.Create)) 
      { 
       serializer.WriteObject(fs, templateData); 
       success = true; 
      } 

我得到一個時writeObject()可以獲取調用StackOverflowException,我是什麼原因造成這樣的事情發生無能。

層次結構中的所有類都使用[DataContract]裝飾,要序列化的成員使用[DataMember]進行處理。

任何幫助,將不勝感激。

+0

你第一次得到這個異常的時候叫什麼? – 2011-02-11 13:33:20

+0

什麼是DataHolder?什麼是`templateData`?除了遺傳以外,其他類型包括什麼? – 2011-02-11 13:36:31

回答

3

如果在圖中有一個循環,我可能會期望類似這樣的事情,但在某種程度上,而不是被檢測爲對象標識失敗。通過循環,我的意思是:

using System.Runtime.Serialization; 
[DataContract] class Foo { 
    public Foo() { Bar = this; } 
    [DataMember] public Foo Bar { get; set; } 
    static void Main() { 
     new DataContractSerializer(typeof(Foo)).WriteObject(
      System.IO.Stream.Null, new Foo()); 
    } 
} 

會拋出錯誤:

Object graph for type 'Foo' contains cycles and cannot be serialized if reference tracking is disabled.

這是因爲它是試圖走樹(不是圖),並注意到重複(同一對象的引用) ,並停下來。然而,通過測試上述內容(並看看get何時被調用),看起來DCS實際上是通過發現疼痛來實現這一點 - 在中止之前的深度非常高。

本地方面,我得到528電話Bar在它死亡之前。如果您已經在堆棧中使用以上的複合代碼,那肯定會造成堆棧溢出。

相關問題