2012-12-19 69 views
2

我正在使用.NET XmlSerializer類將一個XML字符串寫入StringWriter(而不是WCF或JSON或其他任何涉及服務的東西)。XmlSerializer可以支持循環引用嗎?

經過幾小時的試圖找出爲什麼我在撥打XmlSerializer.Serialize()後得到了There was an error generating the XML document的例外,我終於發現它涉及到循環引用。我的課是這樣的:

class Table 
{ 
    public List<Columns> Columns {get; set;} 
} 

class Column 
{ 
    public Table Table {get; set;} 
} 

正如你可以看到,表中的列的集合,但集合中的每一列還持有它的父表的引用。

我不要想要在序列化期間忽略該屬性。我想能夠反序列化它,而不必重建引用。當我使用WCF時,有一種方法可以在線路中保留引用以減小XML的大小。當然,.NET提供了一些類似的將循環關係序列化爲XML的方法,而不會影響XML本身的完整性。

+0

提示:看看'InnerException' ...沿線的某處,它會告訴你,它檢測到一個循環引用 –

+0

這看起來像一個有用的解決方案:http://www.thomaslevesque.com/2009/06/ 12/C-父子關係和 - XML序列化 –

回答

3

不,XmlSerializer不支持這個。你提到WCF:WCF並沒有真正使用XmlSerializer(除非你的類型上都標明瞭這樣) - 它喜歡用DataContractSerializer,並DataContractSerializer可以支持循環引用,但只有在建設來實現的標誌:

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

請注意,DataContractSerializerSettings只在.NET 4.5及以上;在此之前,構造函數過載(參數preserveObjectReferences)也可用。

請注意,XmlSerializerDataContractSerializer不是1:1兼容;他們在許多微妙的方面表現不同。