C# XML反序列化问题:无法生成临时类(result=1)及数组类型转换错误求助
解决XML反序列化中的多维数组类型转换错误
你遇到的问题根源在于xsd工具自动生成的类结构没有正确区分XML里两种不同的<C>元素:一种是定义列元数据(带name和type属性),另一种是存储行数据(仅包含文本值)。工具把这两种元素都映射到了同一个C类,再加上不合理的多维数组定义,直接导致了反序列化时的类型转换冲突。
下面是手动调整后的类结构,完美匹配你的XML格式,能正常完成反序列化:
using System.Collections.Generic; using System.Xml.Serialization; [XmlRoot("AuditEntryData", Namespace = "")] public class AuditEntryData { [XmlElement("AuditEntryValue")] public List<AuditEntryValue> AuditEntryValues { get; set; } = new List<AuditEntryValue>(); [XmlElement("AuditEntryTableValues")] public AuditEntryTableValues AuditEntryTableValues { get; set; } } public class AuditEntryValue { [XmlAttribute("name")] public string Name { get; set; } [XmlAttribute("newValue")] public string NewValue { get; set; } [XmlAttribute("type")] public string Type { get; set; } [XmlAttribute("oldValue")] public string OldValue { get; set; } } public class AuditEntryTableValues { [XmlElement("T")] public TableData Table { get; set; } } public class TableData { [XmlAttribute("name")] public string Name { get; set; } [XmlElement("Columns")] public ColumnDefinitions Columns { get; set; } [XmlElement("OldValues")] public RowCollection OldValues { get; set; } [XmlElement("NewValues")] public RowCollection NewValues { get; set; } } public class ColumnDefinitions { [XmlElement("C")] public List<ColumnDefinition> ColumnList { get; set; } = new List<ColumnDefinition>(); } public class ColumnDefinition { [XmlAttribute("name")] public string Name { get; set; } [XmlAttribute("type")] public string Type { get; set; } } public class RowCollection { [XmlElement("R")] public List<Row> Rows { get; set; } = new List<Row>(); } public class Row { [XmlElement("C")] public List<string> CellValues { get; set; } = new List<string>(); }
反序列化测试代码
你可以用这段代码验证反序列化效果:
using System.IO; using System.Xml.Serialization; var xmlSerializer = new XmlSerializer(typeof(AuditEntryData)); using var reader = new StringReader(yourXmlContent); // 替换成你的XML字符串 var auditData = (AuditEntryData)xmlSerializer.Deserialize(reader);
修改思路说明
- 拆分混淆的元素:把两种
<C>元素拆分成ColumnDefinition(对应列定义)和CellValues(对应行单元格值),彻底解决类型混淆问题 - 用集合替代多维数组:用
List<T>替换xsd生成的多维数组,既符合XML的嵌套结构,也更便于后续的数据处理 - 明确层级关系:每个类对应XML的一个节点层级,让XmlSerializer能精准映射每个元素和属性
这样修改后,你不仅能成功反序列化整个XML,OldValues和NewValues里的行数据也能被正确加载到对应的集合中。
内容的提问来源于stack exchange,提问作者Thyrador
相关产品推荐
相关产品推荐

