XmlSerializer可实现对象与XML互转,需类有公共无参构造函数及可读写public成员;支持XmlElement[XmlIgnore]等特性控制序列化行为,反序列化需XML结构匹配目标类型。

在C#中,用 XmlSerializer 类就能轻松把对象转成XML(序列化),也能把XML还原成对象(反序列化)。关键是要让类支持XML序列化——比如加必要的特性、保证字段/属性可访问。
序列化对象为XML字符串
使用 XmlSerializer 将实例写入 StringWriter,即可获得XML文本。注意:被序列化的类必须有公共无参构造函数,要序列化的字段或属性需是 public 且可读可写。
- 给类加上
[Serializable]不是必须的(XmlSerializer不依赖它) - 用
[XmlElement]可自定义节点名,[XmlAttribute]可把属性序列化为XML属性 - 用
[XmlIgnore]跳过某个字段/属性不参与序列化
反序列化XML字符串为对象
把XML字符串加载进 StringReader,再用 XmlSerializer.Deserialize() 还原为对象。XML结构必须和目标类型匹配,否则会抛出异常。
- 若XML含命名空间,需在
XmlSerializer构造时传入XmlRootAttribute并设置Namespace - 反序列化前建议用
Try-Catch捕获InvalidOperationException或XmlException - 空元素或缺失字段,默认会用类型的默认值(如 int=0,string=null)
处理常见问题的小技巧
实际用的时候容易踩坑,比如日期格式、集合序列化、只读属性等。
- DateTime 默认按 ISO 8601 输出(如
2023-05-12T14:30:00),如需自定义,可用ToString("yyyy-MM-dd")转为字符串属性再序列化 - List/T[] 等集合可直接序列化;若用
IEnumerable接口,需确保运行时是具体可序列化类型(如 List) - 只读属性(只有 get)无法反序列化,除非改用私有字段 + 公共属性,或用
[XmlElement]配合setter
基本上就这些。XmlSerializer 简单直接,适合结构稳定、可控的场景。如果需要更灵活控制(如处理任意JSON/XML混合、忽略大小写、动态字段),可以考虑 System.Text.Json 或第三方库,但纯XML交互,它够用又可靠。










