XmlSerializer 是 C# 中轻量级 XML 序列化工具,支持 POCO 类的序列化与反序列化,需配合 XmlRoot、XmlElement 等特性控制结构,原生支持数组和 List,但不支持 Dictionary;注意编码、XML 声明、性能缓存及类型限制。

XmlSerializer 是 C# 中最常用、最轻量的 XML 序列化工具,适合将简单对象(尤其是 POCO 类)快速转为 XML 字符串或文件,也支持反序列化。它不依赖属性标记也能工作,但要控制输出结构,必须配合 [XmlRoot]、[XmlElement]、[XmlAttribute] 等特性使用。
基础用法:默认序列化
只要类有公共读写属性或字段,且有无参构造函数,就能直接序列化:
- 创建
XmlSerializer实例时传入类型(如new XmlSerializer(typeof(Person))) - 调用
Serialize()方法,传入TextWriter或Stream(如StringWriter或FileStream) - 反序列化用
Deserialize(),传入TextReader或Stream
注意:私有成员、只读属性、泛型集合(如 List)默认可序列化,但字典(Dictionary)不支持,需换用 SerializableDictionary 或自定义处理。
控制 XML 结构:常用特性
用特性精确指定节点名、顺序、是否为属性、是否忽略等:
-
[XmlRoot("Customer")]—— 指定根元素名称 -
[XmlElement("Name")]—— 将属性映射为子元素(可设Order = 1控制顺序) -
[XmlAttribute("id")]—— 将属性作为 XML 属性输出 -
[XmlIgnore]—— 跳过该字段/属性 -
[XmlElement(IsNullable = true)]—— 允许输出
例如:public string FirstName { get; set; } 加上 [XmlElement("first-name")],就会生成 。
处理集合与嵌套对象
XmlSerializer 原生支持数组和 List,但需注意:
- 集合属性名默认作为父节点,内部每个项用
包裹(可通过[XmlArray("Orders")]和[XmlArrayItem("Order")]自定义) - 嵌套对象自动递归序列化,无需额外配置(前提是嵌套类也满足可序列化条件)
- 若集合项类型不唯一(如基类含多个子类),需用
[XmlInclude(typeof(SubClass))]提前声明
实用技巧与避坑提醒
实际开发中容易遇到的问题和应对方式:
-
中文乱码?用
XmlWriter.Create(stream, new XmlWriterSettings { Encoding = Encoding.UTF8 })显式指定编码 - 想省略 XML 声明(
)?设置XmlWriterSettings.OmitXmlDeclaration = true - 性能敏感场景?
XmlSerializer会为每个类型动态生成临时程序集,首次序列化较慢;可提前调用new XmlSerializer(type)缓存实例复用 - 无法序列化接口、委托、指针、非公共构造函数——这些是硬性限制,需改用
DataContractSerializer或 JSON 替代
不复杂但容易忽略。









