我正在使用.NET XmlSerializer
类将XML字符串写入StringWriter(而不是WCF或JSON或其他涉及服务的内容)。
在调用There was an error generating the XML document
后试图找出为什么我得到XmlSerializer.Serialize()
的例外的几个小时之后,我终于发现它涉及一个循环引用。我的课程看起来像这样:
class Table
{
public List<Columns> Columns {get; set;}
}
class Column
{
public Table Table {get; set;}
}
如您所见,表有一组列,但该集合中的每一列也都包含对其父表的引用。
我不 想要在序列化期间忽略该属性。我希望能够反序列化它,而不必重建引用。回到我使用WCF时,有一种方法可以保留线路上的引用以减小XML的大小。当然,.NET提供了一些类似的方法,可以将循环关系序列化为XML,而不会损害XML本身的完整性。
答案 0 :(得分:4)
不,XmlSerializer
不支持此功能。你提到WCF:WCF并没有真正使用XmlSerializer
(除非你的类型有明确的标记) - 它更喜欢使用DataContractSerializer
,而DataContractSerializer
可以支持循环引用,但仅在构造时启用标志:
var serializer = new DataContractSerializer(typeof(Foo),
new DataContractSerializerSettings
{
PreserveObjectReferences = true
});
请注意,DataContractSerializerSettings
仅适用于.NET 4.5及更高版本;在此之前,构造函数重载(preserveObjectReferences
参数)也可以使用相同的内容。
请注意XmlSerializer
和DataContractSerializer
不兼容1:1;他们以许多微妙的方式表现得不同。