C#中XML反序列化为何始终返回NULL值?
问题原因与解决方案
你的代码反序列化后属性全为null,核心问题是类结构和XML的层级完全不匹配:
- XML里的
Id/Bool/Title/Something是<Item>节点的子元素,而非根节点<ArrayOfSomething>的属性,但你给ArrayOfSomething的属性加了[XmlAttribute]特性,相当于告诉序列化器去根节点的属性里找这些值,自然找不到。 - 根节点
<ArrayOfSomething>包含多个<Item>子节点,但你的ArrayOfSomething类没有定义对应的集合属性来承载这些Item。
修正后的代码实现
1. 定义正确的实体类
[XmlRoot("ArrayOfSomething")] public class ArrayOfSomething { // 用XmlElement指定每个子节点名称为Item,序列化器会自动识别多个Item节点 [XmlElement("Item")] public List<Item> Items { get; set; } = new List<Item>(); } // 定义Item类,对应XML里的每个Item节点 public class Item { // 名称和XML子元素一致,可省略XmlElement特性,如需自定义名称再添加 public string Id { get; set; } public string Bool { get; set; } public string Title { get; set; } public string Something { get; set; } }
2. 反序列化代码(可保留命名空间忽略逻辑,或直接移除)
public void Run() { XmlSerializer serializer = new XmlSerializer(typeof(ArrayOfSomething)); string xmlContent = @"<ArrayOfSomething xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> <Item> <Id>0</Id> <Bool>false</Bool> <Title>Some text</Title> <Something/> </Item> <Item> <Id>0</Id> <Bool>false</Bool> <Title>Some text 2</Title> <Something/> </Item> <Item> <Id>0</Id> <Bool>false</Bool> <Title>Some text 3</Title> <Something/> </Item> <Item> <Id>0</Id> <Bool>false</Bool> <Title>Some text 4</Title> <Something/> </Item> </ArrayOfSomething>"; using StringReader sr = new StringReader(xmlContent); // 不需要忽略命名空间的话,直接用sr反序列化即可 // var s = (ArrayOfSomething)serializer.Deserialize(sr); // 保留命名空间忽略逻辑的话 using NamespaceIgnorantXmlTextReader XMLWithoutNamespace = new NamespaceIgnorantXmlTextReader(sr); var s = (ArrayOfSomething)serializer.Deserialize(XMLWithoutNamespace); // 此时s.Items会包含4个Item对象,每个Item的属性都能正确赋值 }
额外说明
- 如果你原本误以为XML里的字段是根节点的属性,那XML结构应该是类似
<ArrayOfSomething Id="0" Bool="false" ...>这种格式,才需要用[XmlAttribute]。 - 序列化器匹配规则是严格对应XML的节点层级和类型,务必保证类结构和XML结构一致。
内容的提问来源于stack exchange,提问作者dddd9999
相关产品推荐
相关产品推荐

