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

C#反序列化XML数组元素时属性无法赋值问题求助

XML反序列化:Slot类Name属性无法赋值的解决方法

问题核心:当类直接继承List<T>这类集合类型时,XmlSerializer默认只会序列化集合的元素内容,会忽略类上的附加属性;同时集合项的元素名没有和XML中的标签对应,导致属性无法被正确解析。

按照以下步骤修改C#类即可解决,完全符合你“不使用[XmlArrayItem]、不编写自定义反序列化”的要求:

修改后的完整代码

[XmlRoot("SLOT_DEFINITION")]
public class SlotDefinition : List<Slot>
{
    // 用XmlElement指定集合项对应XML中的<SLOT>标签
    [XmlElement("SLOT")]
    public new List<Slot> Slots
    {
        get => base.ToList();
        set
        {
            Clear();
            AddRange(value);
        }
    }
}

[XmlType("SLOT")]
public class Slot : List<Mesh>
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    // 用XmlElement指定集合项对应XML中的<MESH>标签
    [XmlElement("MESH")]
    public new List<Mesh> Meshes
    {
        get => base.ToList();
        set
        {
            Clear();
            AddRange(value);
        }
    }
}

[XmlType("MESH")]
public class Mesh
{
    [XmlAttribute("model")]
    public string ModelPath { get; set; }
}

关键修改说明

  1. SlotDefinition类:新增Slots属性并标记[XmlElement("SLOT")],明确告诉序列化器集合中的每个元素对应XML里的<SLOT>标签,同时通过属性包装基类的List操作,保留原有集合特性。
  2. Slot类:
    • 移除多余的[XmlRoot("SLOT")](该类并非XML根节点)
    • 新增Meshes属性并标记[XmlElement("MESH")],指定集合中的每个Mesh对应XML里的<MESH>标签
    • 保留[XmlAttribute("name")]标记Name属性,此时序列化器会同时解析该属性和集合元素
  3. Mesh类:移除重复的[XmlType("MESH")]特性,避免冲突

修改完成后,原有的反序列化代码无需改动,即可正确获取Slot的Name属性值。

内容的提问来源于stack exchange,提问作者Thomas Slade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:42:52