xml序列化和反序列化列表时容易混淆的坑[XmlArray和XmlArrayItem]
举例有如下一个xml格式
<rss version="5.1">
<list page="1" pagecount="3557" pagesize="20" recordcount="71140">
<video>...</video>
<video>...</video>
</list>
</rss>
作为一个新手,在定义一个可以序列化和反序列化的C#数据类时,容易写成如下代码
[Serializable]
[XmlRoot("rss")]
public class ETVideoRSS {
[XmlAttribute("version")]
public string version { get; set; }
[XmlElement("list")]
public ETVideoRSSList list { get; set; }
}
[Serializable]
public class ETVideoRSSList {
[XmlAttribute("page")]
public string page { get; set; }
[XmlAttribute("pagecount")]
public string pagecount { get; set; }
[XmlAttribute("pagesize")]
public string pagesize { get; set; }
[XmlAttribute("recordcount")]
public string recordcount { get; set; }
[XmlArrayItem("video")] //新手容易出错的地方,这里是一个数组,那么就加入一个数组的元标记,或者加入XmlArray(),
public ETVideoRSSVideo[] video { get; set; }
}
[Serializable]
public class ETVideoRSSVideo {
...
}
那么这么写以后,程序执行序列化和反序列化的时候,一般不会出现异常错误。只是发现这个video列表根本没有得到数据,只是一个空数组
正确的写法应该是
[XmlElement("video")]
public ETVideoRSSVideo[] video { get; set; }
或
public List<ETVideoRSSVideo> video { get; set; }
那么这个XmlArrayItem有什么作用呢?
就是在这个video节点上面再加一层xml结点包装,故按照上面的错误写法,实际生成xml应该如下
<rss version="5.1">
<list page="1" pagecount="3557" pagesize="20" recordcount="71140">
<video>
<video>...</video>
<video>...</video>
<video/>
</list>
</rss>
其实XmlArray和XmlArrayItem在使用上是有区别的,一个限定父节点名称,一个限定数组节点名称,但这里如果错误使用的情况下,效果是一样的
具体使用方法,可以参考官方说明:https://docs.microsoft.com/en-us/dotnet/standard/serialization/controlling-xml-serialization-using-attributes
本人虽说不是IT新手,但由于长期未使用xml,在这个问题上也浪费了2个小时来解决问题,所以希望看到文章的人,可以不用浪费时间在这个问题上!