C#如何对内部类进行带XML特性的序列化与反序列化?
内部类的XML序列化与反序列化实现方案
问题背景
需要对以下内部类进行XML序列化/反序列化,生成指定格式的XML:
内部类定义
internal class Data { public string? Name { get; set; } public string? Type { get; set; } public List<DataWithAttribute> DataList { get; set; } } internal class DataWithAttribute { public string? FirstAttribute { get; set; } public string? SecondAttribute { get; set; } }
期望XML格式
<Data> <Name>Some name</Name> <Type>Some value</Type> <DataList> <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" /> <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" /> <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" /> </DataList> </Data>
尝试过XmlSerializer但误以为只能处理公共类,DataContractSerializer支持内部类但无法实现所需的XML属性格式。
解决方案
在同一程序集内,XmlSerializer可以直接处理内部类,只需添加XML序列化特性并编写序列化/反序列化方法:
1. 修改内部类添加XML特性
using System.Xml.Serialization; internal class Data { public string? Name { get; set; } public string? Type { get; set; } // 指定数组项的元素名称 [XmlArrayItem("DataWithAttribute")] public List<DataWithAttribute> DataList { get; set; } = new(); } internal class DataWithAttribute { // 标记为XML属性 [XmlAttribute] public string? FirstAttribute { get; set; } [XmlAttribute] public string? SecondAttribute { get; set; } }
2. 序列化方法
using System.IO; using System.Xml.Serialization; public static void SerializeData(Data data, string filePath) { // 同一程序集内可访问内部类Type,直接创建XmlSerializer实例 var serializer = new XmlSerializer(typeof(Data)); using var writer = new StreamWriter(filePath); serializer.Serialize(writer, data); }
3. 反序列化方法
using System.IO; using System.Xml.Serialization; public static Data? DeserializeData(string filePath) { var serializer = new XmlSerializer(typeof(Data)); using var reader = new StreamReader(filePath); return serializer.Deserialize(reader) as Data; }
关键说明
XmlSerializer并非只能处理公共类:在同一程序集内部,可以直接通过内部类的Type创建序列化实例,因为程序集内对内部类有访问权限。- 通过
[XmlAttribute]特性,将DataWithAttribute的属性序列化为XML节点的属性,匹配期望格式。 [XmlArrayItem]确保DataList的子元素名称为DataWithAttribute,与目标XML结构一致。
内容的提问来源于stack exchange,提问作者Kartopelka
相关产品推荐
相关产品推荐

