【发布时间】:2012-12-19 03:32:56
【问题描述】:
在 WCF 服务中,我有一个数据契约(对象)包含子项的集合(其中集合具有 datamemeber 属性)。子集合中的对象具有对父集合的引用作为属性。如果父对象子集合为空或包含空父引用,一切都很好,但如果父引用已填充且父子集已填充,则它将永远序列化。
这是一组测试控制台代码,向您展示我在说什么。
class Program
{
static void Main(string[] args)
{
MyParentObject parent = BuildParent();
string xml = Serializer<MyParentObject>.Serialize(parent);
System.Console.Write(xml);
System.Console.ReadKey();
}
static MyParentObject BuildParent()
{
MyParentObject parent = new MyParentObject();
parent.MyParentObjectId = 123;
parent.MyParentObjectName = "Test Parent Object";
parent.MyChildren = new List<MyChildObject>();
for (int i = 0; i < 10; i++)
{
MyChildObject child = new MyChildObject();
child.MyParent = parent;
child.MyChildObjectId = i;
child.MyChildObjectName = string.Format("Test Child Name {0}", i.ToString());
parent.MyChildren.Add(child);
}
return parent;
}
}
[DataContract]
public class MyParentObject
{
[DataMember]
public int MyParentObjectId { get; set; }
[DataMember]
public string MyParentObjectName { get; set; }
[DataMember]
public List<MyChildObject> MyChildren { get; set; }
}
[DataContract]
public class MyChildObject
{
[DataMember]
public MyParentObject MyParent { get; set; }
[DataMember]
public int MyChildObjectId { get; set; }
[DataMember]
public string MyChildObjectName { get; set; }
}
public class Serializer<T>
{
public static string Serialize(T entity)
{
StringBuilder sb = new StringBuilder();
DataContractSerializer dcs = new DataContractSerializer(typeof(T));
using (XmlWriter writer = XmlWriter.Create(sb))
{
dcs.WriteObject(writer, entity);
writer.Flush();
}
return sb.ToString();
}
}
除了清除导致这个无限序列化循环的子/父引用之外,还有什么方法可以解决这个问题吗?
编辑:我知道我可以删除 datamember 属性,但我想保留它,而不是无限序列化。
【问题讨论】:
-
这样的循环引用通常是一个糟糕的设计选择。
标签: c# .net serialization datacontract