如何为List 实现设置XmlArrayItem元素名称?
我想创建一个自定义XML结构,如下所示:
为了能够做到这一点,我创建了List
的实现。 我的代码如下:
[XmlRootAttribute(ElementName="Hotels")] public class HotelList: List
因为List所持有的类不是名为Hotel
而是HotelBasic
我的xml就像
如何在不必实现ISerializable
或IEnumerable
情况下解决这个问题?
假设您正在使用XmlSerializer
,如果您要做的只是更改HotelBasic
类的序列化方式,您可以使用XmlTypeAttribute
:
[XmlType(TypeName = "Hotel")] public class HotelBasic { public string Name { get; set; } }
与HotelList
类一起使用时,它将被序列化为:
One Two
[XmlArray("Hotels")] [XmlArrayItem(typeof(Hotel), ElementName="Hotel")] public HotelList[] Messages { get; set; }
应该产生:
[XmlRoot("Hotels")] public class HotelList : IXmlSerializable { public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { this.Hotels = XDocument.Load(reader) .Select(h => new Hotel { Name = (string)h.Attribute("name") } .ToList(); } public void WriteXml(XmlWriter writer) { throw new NotSupportedException(); } }
我认为madd0在这里显示了最简单的选项,但仅仅是为了完整性……我个人不推荐“将列表序列化为根对象” – 出于各种原因(包括:我看到这些属性不起作用)至少在平台上 – 可能是CF或SL,不记得了)。 相反,我总是建议使用自定义根类型:
[XmlRoot("Hotels")] public class HotelResult // or something similar { [XmlElement("Hotel")] public List Hotels { get { return hotel; } } private readonly List hotels = new List (); }
这将具有相同的xml结构,并允许更大的灵活性(您可以向根添加其他属性/元素),并且不会将List
烘焙到您的类型模型中(更喜欢封装而不是inheritance等)。
上述就是C#学习教程:如何为List 实现设置XmlArrayItem元素名称?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1008977.html