.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
相关产品推荐
相关产品推荐

