我需要序列化IEnumerable.同时我想要根节点是“通道”和第二级节点 – Channel(而不是ChannelConfiguration).
这是我的串行器定义:
_xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>),new XmlRootAttribute("Channels"));
我通过提供XmlRootAttribute来覆盖根节点,但是我没有找到一个选项来设置Channel而不是ChannelConfiguration作为第二级节点.
我知道我可以通过引入IEnumerable的包装器和使用XmlArrayItem来做到这一点,但是我不想这样做.
解决方法
像这样:
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 { } });