WCF对象序列化问题

时间:2014-02-27 14:20:28

标签: c# wcf serialization tree .net-4.5

我有一个基本对象,我通过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 });
        }
    }
}

不幸的是,每当我尝试检索具有Children的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} });
} 

我知道,当通过电线传输时,构造器会被剥离,但我很困惑,为什么一个完整的物体仍会像这样在我的脸上爆炸。

1 个答案:

答案 0 :(得分:2)

这是因为你有一个循环引用。即父母有链接到孩子,孩子有父母的链接。所以你是对的,这是一个序列化问题 - 当对象被序列化时,你会因为无穷大而得到异常。

一个简单的解决方法是将DataContract标记为参考,如下所示:

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