我有一个基本对象,我通过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} });
}
我知道,当通过电线传输时,构造器会被剥离,但我很困惑,为什么一个完整的物体仍会像这样在我的脸上爆炸。
答案 0 :(得分:2)
这是因为你有一个循环引用。即父母有链接到孩子,孩子有父母的链接。所以你是对的,这是一个序列化问题 - 当对象被序列化时,你会因为无穷大而得到异常。
一个简单的解决方法是将DataContract
标记为参考,如下所示:
[DataContract(IsReference=true)]
public class ProjectTreeNode
{
// ...
}