2

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

4

1 回答 1

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 兼容的;他们在许多微妙的方面表现不同。

于 2012-12-19T15:31:16.833 回答