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

.NET C#寻找XSerializer替代库:支持多列表同名XML元素序列化

替代XSerializer的XML序列化方案(支持多List输出同名元素)

1. 原生System.Xml.Serialization(推荐,零额外依赖)

原生XmlSerializer完全能满足你的需求,通过属性标记就能实现多List输出同名元素,且自动处理复杂继承层级和大量字段,无需手动构建XML。

平级输出同名元素(无List父节点)

给每个List属性标记[XmlElement],指定统一的元素名和对应类型:

public class InputBoard
{
    [XmlElement("BoardInput", typeof(Input))]
    public List<Input> Inputs { get; set; }

    [XmlElement("BoardInput", typeof(USBInput))]
    public List<USBInput> USBInputs { get; set; }

    [XmlElement("BoardInput", typeof(SerialInput))]
    public List<SerialInput> SerialInputs { get; set; }
}

序列化后会生成平级的<BoardInput>元素,不管来自哪个List。

保留List父节点(仅子元素同名)

如果需要保留每个List的父容器节点,改用[XmlArrayItem]:

public class InputBoard
{
    [XmlArrayItem("BoardInput", typeof(Input))]
    public List<Input> Inputs { get; set; }

    [XmlArrayItem("BoardInput", typeof(USBInput))]
    public List<USBInput> USBInputs { get; set; }

    [XmlArrayItem("BoardInput", typeof(SerialInput))]
    public List<SerialInput> SerialInputs { get; set; }
}

这种结构下,每个List会有自己的父节点(比如<Inputs>),内部的子元素都是<BoardInput>。

处理不可修改的类(第三方类)

如果无法修改原有类的代码,用XmlAttributeOverrides动态配置:

var overrides = new XmlAttributeOverrides();

// 批量配置三个List属性的XmlElement规则
var inputAttr = new XmlElementAttribute("BoardInput") { Type = typeof(Input) };
overrides.Add(typeof(InputBoard), "Inputs", inputAttr);

var usbAttr = new XmlElementAttribute("BoardInput") { Type = typeof(USBInput) };
overrides.Add(typeof(InputBoard), "USBInputs", usbAttr);

var serialAttr = new XmlElementAttribute("BoardInput") { Type = typeof(SerialInput) };
overrides.Add(typeof(InputBoard), "SerialInputs", serialAttr);

// 创建自定义序列化器
var serializer = new XmlSerializer(typeof(InputBoard), overrides);

这种方式完全不侵入原有代码,适合复杂遗留项目。

2. Newtonsoft.Json(转XML序列化)

如果已经在项目中使用Newtonsoft.Json,也可以用它实现XML序列化,同样支持多List输出同名元素:

public class InputBoard
{
    [JsonProperty("BoardInput")]
    public List<Input> Inputs { get; set; }

    [JsonProperty("BoardInput")]
    public List<USBInput> USBInputs { get; set; }

    [JsonProperty("BoardInput")]
    public List<SerialInput> SerialInputs { get; set; }
}

序列化时使用XmlNodeConverter:

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new XmlNodeConverter() }
};
var xmlContent = JsonConvert.SerializeObject(yourInputBoardInstance, settings);

它对复杂继承和大量字段的兼容性很好,无需手动处理层级。

避坑提醒

  • RockLib.Serialization、ExtendedXmlSerializer这类库默认严格校验元素名唯一性,会抛出InvalidOperationException,除非进行深度定制,成本远高于上述方案,不推荐。
  • 对于10层以上的继承层级,原生XmlSerializer需要确保所有派生类都被[XmlInclude]标记,或者在XmlAttributeOverrides中指定对应类型,否则会序列化失败。

内容的提问来源于stack exchange,提问作者Adam Mendoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:52:46