2011-10-14 59 views
1

我們正在開發一個應用程序,使用EF4 POCO & WCF 4.0。我們使用的是DataContractSerializer,我們添加了IsReference=trueWCF中帶有DataContractSerializer和IsReference = true的StackOverflowException

延遲加載被禁用,應用程序工作正常,但現在在其中一個實體的某些實例上,我們看到StackOverflowException。我們之前有過循環引用,沒有問題。

有關如何繼續的提示?

+1

您可以確認這會導致該堆棧溢出實體有正確的'IsReference'屬性?即你在某處沒有錯過某些屬性? –

+0

感謝您的建議,我正在編寫一個對象圖驗證器來告訴我對象圖中哪些類缺少該屬性。 – Alireza

+0

運行測試..沒有自定義類有任何問題...我會發布測試代碼。 – Alireza

回答

0

的代碼來測試有關DataContract屬性問題:

public class ObjectGraphValidator 
{ 
    List<object> _knownObjects = new List<object>(); 
    Dictionary<Type, int> _encounteredCount = new Dictionary<Type, int>(); 
    List<Type> _nonReferenceTypes = new List<Type>(); 

    public void ValidateObjectGraph(object obj) 
    { 
     Type type = obj.GetType(); 
     if (_encounteredCount.ContainsKey(type)) 
      _encounteredCount[type]++; 
     else 
     { 
      _encounteredCount.Add(type, 1); 
      if (type.IsValueType) 
       _nonReferenceTypes.Add(type); 
      DataContractAttribute att = Attribute.GetCustomAttribute(type, typeof(DataContractAttribute)) as DataContractAttribute; 
      if (att == null || !att.IsReference) 
       _nonReferenceTypes.Add(type); 
     } 

     if (obj.GetType().IsValueType) 
      return; 
     if (_knownObjects.Contains(obj)) 
      return; 
     _knownObjects.Add(obj); 
     if (obj is IEnumerable) 
      foreach (object obj2 in (obj as IEnumerable)) 
       ValidateObjectGraph(obj2); 
     foreach (PropertyInfo property in type.GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic)) 
      if (property.GetIndexParameters().Count() == 0) 
      { 
       object value = property.GetValue(obj, null); 
       if (value == null) 
        continue; 
       ValidateObjectGraph(value); 
      } 
    } 
} 
相關問題