C#继承List类实现XML序列化时如何自定义元素节点名?
解决C#继承List类的XML序列化自定义元素节点名问题
方法1:使用特性直接标记类
给继承List<string>的类添加[XmlElement]特性,直接指定自定义的元素节点名:
using System.Collections.Generic; using System.Xml.Serialization; [XmlElement("CustomItem")] public class CustomStringList : List<string> { }
序列化示例代码:
var list = new CustomStringList { "Value1", "Value2" }; var serializer = new XmlSerializer(typeof(CustomStringList)); using var writer = new StringWriter(); serializer.Serialize(writer, list); Console.WriteLine(writer.ToString());
输出XML结构:
<CustomStringList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CustomItem>Value1</CustomItem> <CustomItem>Value2</CustomItem> </CustomStringList>
方法2:使用XmlAttributeOverrides动态指定(适合无法修改类源码的场景)
如果不能修改继承List<string>的类的源码,可以通过XmlAttributeOverrides在创建序列化器时动态覆盖元素节点名:
using System.Collections.Generic; using System.Xml.Serialization; public class CustomStringList : List<string> { } // 配置序列化规则 var attributeOverrides = new XmlAttributeOverrides(); var xmlAttributes = new XmlAttributes(); xmlAttributes.XmlElements.Add(new XmlElementAttribute("CustomItem")); attributeOverrides.Add(typeof(CustomStringList), xmlAttributes); // 创建自定义序列化器并执行序列化 var serializer = new XmlSerializer(typeof(CustomStringList), attributeOverrides); var list = new CustomStringList { "Value1", "Value2" }; using var writer = new StringWriter(); serializer.Serialize(writer, list); Console.WriteLine(writer.ToString());
输出结果与方法1完全一致,元素节点名为<CustomItem>。
以上两种方法均无需实现IXmlSerializable接口,可直接实现案例C编码方式下得到案例B序列化结果的需求。
内容的提问来源于stack exchange,提问作者PapaAtHome
相关产品推荐
相关产品推荐

