2011-11-22 75 views
9

我需要序列化IEnumerable。同時,我希望根節點是「通道」和第二級節點 - 通道(而不是通道配置)。覆蓋XmlSerialization的類名稱

這裏是我的串行的定義:

_xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), new XmlRootAttribute("Channels")); 

我已經重寫根節點通過提供XmlRootAttribute,但我還沒有找到一個選項來設置頻道,而不是作爲ChannelConfiguration第二級節點。

我知道我可以通過引入IEnumerable的包裝器並使用XmlArrayItem來實現,但我不想這樣做。

+3

爲什麼你不想做簡單的選擇?出於好奇? (注意:使用非平凡的構造函數意味着你必須**緩存序列化程序,否則你會泄漏程序集;基本的'XmlSerializer(Type)'構造函數不會遭受這個) –

+0

你是ChannelConfiguration類的所有者嗎?你可以用屬性裝飾它?如果是,我可能有一個解決方案。 –

+0

@MarcGravell,也許你是對的,我應該用包裝 – SiberianGuy

回答

15

像這樣:

XmlAttributeOverrides or = new XmlAttributeOverrides(); 
or.Add(typeof(ChannelConfiguration), new XmlAttributes 
{ 
    XmlType = new XmlTypeAttribute("Channel") 
}); 
var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), or, 
    Type.EmptyTypes, new XmlRootAttribute("Channels"), ""); 
xmlSerializer.Serialize(Console.Out, 
    new List<ChannelConfiguration> { new ChannelConfiguration { } }); 

注意你必須緩存和重新使用該串行器實例。我也強烈建議你使用「包裝類」方法 - 更簡單,沒有組裝泄漏的風險,而且IIRC可以在更多的平臺上工作(很確定我已經看到了上述情況在某些實現方面行爲不同 - SL或WP7或類似的)。

如果你有訪問類型ChannelConfiguration,你也可以只使用:

[XmlType("Channel")] 
public class ChannelConfiguration 
{...} 

var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), 
    new XmlRootAttribute("Channels")); 
xmlSerializer.Serialize(Console.Out, 
    new List<ChannelConfiguration> { new ChannelConfiguration { } }); 
11

如果我沒有記錯的話,應該這樣做。

[XmlType("Channel")] 
public class ChannelConfiguration { 

} 
+1

只有當你擁有這個類並且可以裝飾它時纔有效。 –

+0

不,它不會:(XmlElement不能應用於類 – SiberianGuy

+0

我認爲你意味着XmlRoot(「Channel」)? –