XmlSerializer是否可以支持循环引用?

时间:2012-12-19 15:12:25

标签: .net xml-serialization circular-reference

我正在使用.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本身的完整性。

1 个答案:

答案 0 :(得分:4)

不,XmlSerializer不支持此功能。你提到WCF:WCF并没有真正使用XmlSerializer(除非你的类型有明确的标记) - 它更喜欢使用DataContractSerializer,而DataContractSerializer 可以支持循环引用,但仅在构造时启用标志:

var serializer = new DataContractSerializer(typeof(Foo),
    new DataContractSerializerSettings
{
    PreserveObjectReferences = true
});

请注意,DataContractSerializerSettings仅适用于.NET 4.5及更高版本;在此之前,构造函数重载(preserveObjectReferences参数)也可以使用相同的内容。

请注意XmlSerializerDataContractSerializer不兼容1:1;他们以许多微妙的方式表现得不同。