C#怎么序列化对象为XML C# XML序列化与反序列化方法

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 捕获 InvalidOperationExceptionXmlException
  • 空元素或缺失字段,默认会用类型的默认值(如 int=0,string=null)

处理常见问题的小技巧

实际用的时候容易踩坑,比如日期格式、集合序列化、只读属性等。

  • DateTime 默认按 ISO 8601 输出(如 2025-05-12T14:30:00),如需自定义,可用 ToString("yyyy-MM-dd") 转为字符串属性再序列化
  • List/T[] 等集合可直接序列化;若用 IEnumerable 接口,需确保运行时是具体可序列化类型(如 List
  • 只读属性(只有 get)无法反序列化,除非改用私有字段 + 公共属性,或用 [XmlElement] 配合 setter

基本上就这些。XmlSerializer 简单直接,适合结构稳定、可控的场景。如果需要更灵活控制(如处理任意JSON/XML混合、忽略大小写、动态字段),可以考虑 System.Text.Json 或第三方库,但纯XML交互,它够用又可靠。