You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:44:07