加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 覆盖XmlSerialization的类名

发布时间:2020-12-15 17:41:46 所属栏目:百科 来源:网络整理
导读:我需要序列化IEnumerable.同时我想要根节点是“通道”和第二级节点 – Channel(而不是ChannelConfiguration). 这是我的串行器定义: _xmlSerializer = new XmlSerializer(typeof(ListChannelConfiguration),new XmlRootAttribute("Channels")); 我通过提供Xm
我需要序列化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 { } });

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读