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; } }
关键修改说明
- SlotDefinition类:新增
Slots属性并标记[XmlElement("SLOT")],明确告诉序列化器集合中的每个元素对应XML里的<SLOT>标签,同时通过属性包装基类的List操作,保留原有集合特性。 - Slot类:
- 移除多余的
[XmlRoot("SLOT")](该类并非XML根节点) - 新增
Meshes属性并标记[XmlElement("MESH")],指定集合中的每个Mesh对应XML里的<MESH>标签 - 保留
[XmlAttribute("name")]标记Name属性,此时序列化器会同时解析该属性和集合元素
- 移除多余的
- Mesh类:移除重复的
[XmlType("MESH")]特性,避免冲突
修改完成后,原有的反序列化代码无需改动,即可正确获取Slot的Name属性值。
内容的提问来源于stack exchange,提问作者Thomas Slade
相关产品推荐
相关产品推荐

