XML集合反序列化后为空的问题排查与解决请求
问题分析与解决
核心问题1:数据类XML特性与XML结构不匹配
你的Units类使用了[XmlArray("Units")],这要求XML结构是<Units><Units><Unit>...</Unit></Units></Units>,但实际XML里根节点<Units>直接包含<Unit>元素,没有额外的<Units>数组容器,导致反序列化时无法识别Unit节点。
核心问题2:Value结构体的文本值映射错误
XML中<Value Name="xxx">1</Value>的数值是元素的文本内容,但你用了[XmlElement("Value")],这会去寻找子元素<Value>,自然无法匹配。
核心问题3:XML语法错误
你提供的XML结尾是</Unit>,这是闭合错误,应该改为</Units>,语法错误会直接导致反序列化失败或数据丢失。
修正后的代码
1. 数据类修正
[Serializable, XmlRoot("Units")] public class Units { // 直接用XmlElement标记每个Unit节点,不需要XmlArray容器 [XmlElement("Unit")] public List<Unit> AllUnits { get; set; } = new List<Unit>(); // 初始化避免空引用 public Units() { } } [Serializable, XmlType("Unit")] public class Unit { [XmlElement("Type")] public string Type { get; set; } [XmlElement("Name")] public string Name { get; set; } [XmlArray("ConvertTo")] [XmlArrayItem("Value")] public List<Value> ConvertTo { get; set; } = new List<Value>(); public Unit() { } } [Serializable] public struct Value { [XmlAttribute("Name")] public string Name { get; set; } // 用XmlText标记元素的文本内容 [XmlText] public double ConvertValue { get; set; } }
2. XML修正(结尾部分)
将最后一行的</Unit>改为</Units>,确保XML结构闭合正确。
3. 测试代码(保持原有逻辑,建议加空判断)
public XmlSerializer xmlSerializer = new XmlSerializer(typeof(Units)); public MainForm() { using (FileStream filestream = new FileStream("units.xml", FileMode.Open)) { Units units = xmlSerializer.Deserialize(filestream) as Units; // 加空判断避免NullReferenceException MessageBox.Show("XML COUNT: " + (units?.AllUnits?.Count ?? 0).ToString()); } /* some code here */ }
JSON处理的补充说明
如果要转用JSON处理,只需去掉所有XML特性,确保类属性名与JSON字段名一致(或用[JsonProperty]指定映射):
public class Units { public List<Unit> AllUnits { get; set; } = new List<Unit>(); } public class Unit { public string Type { get; set; } public string Name { get; set; } public List<Value> ConvertTo { get; set; } = new List<Value>(); } public struct Value { public string Name { get; set; } public double ConvertValue { get; set; } }
对应的JSON结构示例:
{ "AllUnits": [ { "Type": "Area", "Name": "SquareMeter", "ConvertTo": [ { "Name": "SquareMeter", "ConvertValue": 1 }, { "Name": "SquareKilometer", "ConvertValue": 0.000001 } ] } ] }
内容的提问来源于stack exchange,提问作者gCyanide
相关产品推荐
相关产品推荐

