2014-02-27 32 views
2

我有一個基本對象,我通過WCF通過電線發送。它旨在幫助填充數據樹。這裏的基本結構:WCF對象序列化困境

[DataContract] 
public class ProjectTreeNode 
{ 
    private IList<ProjectTreeNode> _children = new List<ProjectTreeNode>(); 

    [DataMember] 
    public int ParentCategoryID { get; set; } 

    [DataMember] 
    public bool IsProject { get; set; } 

    [DataMember] 
    public int ProjectID { get; set; } 

    [DataMember] 
    public string Description { get; set; } 

    [DataMember] 
    public ProjectTreeNode Parent { get; set; } 

    [DataMember] 
    public IList<ProjectTreeNode> Children 
    { 
     get { return _children; } 
     set { _children = value; } 
    } 

    public ProjectTreeNode() { } 

    public ProjectTreeNode(string description, int parentCategoryID, IEnumerable<ProjectDto> projectChildren) 
    { 
     Description = description; 
     ParentCategoryID = parentCategoryID; 

     foreach (var project in projectChildren) 
     { 
      Children.Add(new ProjectTreeNode { Description = project.Description, IsProject = true, ProjectID = project.ProjectID, Parent = this }); 
     } 
    } 
} 

不幸的是,任何時候我嘗試和檢索ProjectTreeNode有孩子,我從WCF得到錯誤(的CommunicationException,但我相信它實際上掩蓋序列化問題)。

所以這工作得很好:

public ProjectTreeNode TestNode() 
{ 
    return new ProjectTreeNode("Test Node", -1, new ProjectDto[0]); 
} 

但這接收在客戶端異常:

public ProjectTreeNode TestNode() 
{ 
    return new ProjectTreeNode("Test Node", -1, new[] { new ProjectDto { CategoryCombinationID = 123, Description = "Blah", ProjectID = 10} }); 
} 

我知道構造函數被剝離出來的時候通過線路傳輸,但我很困惑爲什麼一個完整的物體仍然會像這樣炸燬我的臉。

+0

問題編號600000與標籤C#:) – Mixxiphoid

+0

一個聲名鵲起的任何其他:) – Killnine

回答

2

這是因爲你有一個循環引用。即父母有鏈接到孩子和孩子有鏈接到父母。所以你是對的,這是一個序列化問題 - 當對象被序列化時,你會在無窮大時遞歸異常。

一個簡單的解決方法是,以紀念DataContract像這樣的引用:

[DataContract(IsReference=true)] 
public class ProjectTreeNode 
{ 
    // ... 
} 
+0

哇好!我沒有把它們放在一起,但它很有意義。屬性的變化就像一個魅力。 – Killnine

+0

很高興我能幫到你。 – Belogix