C#中标准XML序列化使用XmlSerializer类,要求类有public无参构造函数,仅序列化public成员,支持泛型集合但不支持Dictionary;可通过特性定制结构,反序列化需XML与类型匹配。

在C#中,最常用且标准的方式是使用 XmlSerializer 类将对象序列化为XML字符串或文件。它要求类具有公共属性、无参构造函数,并支持基本类型和可序列化的引用类型。
基础序列化:用 XmlSerializer 写入XML字符串
只需创建 XmlSerializer 实例,调用 Serialize 方法,配合 StringWriter 或 MemoryStream 即可获得XML文本:
- 目标类必须有 public 无参构造函数(即使为空也要显式写出)
- 只序列化 public 字段或属性;private/protected 成员默认忽略
- 支持泛型集合(如
List),但不支持Dictionary(需包装或改用其他方式)
var person = new Person { Name = "张三", Age = 28 };
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StringWriter();
serializer.Serialize(writer, person);
string xml = writer.ToString(); // 张三 28
控制XML结构:用特性定制输出
通过添加 [XmlRoot]、[XmlElement]、[XmlAttribute] 等特性,可精确控制元素名、是否作为属性、是否忽略等:
-
[XmlRoot("User")]→ 根节点名为 -
[XmlElement("Fullname")]→ 属性Name输出为 -
[XmlAttribute("id")]→ 将字段作为 XML 属性: -
[XmlIgnore]→ 跳过该属性不序列化
反序列化:从XML还原对象
使用同一个 XmlSerializer 实例调用 Deserialize,传入 TextReader 或 Stream:
- XML结构需与目标类型匹配,否则抛出异常
- 若XML含未知元素,可加
[XmlAnyElement]捕获冗余内容 - 建议用 try-catch 包裹,处理格式错误或类型不匹配
string xml = ""; var serializer = new XmlSerializer(typeof(Person)); using var reader = new StringReader(xml); var p = (Person)serializer.Deserialize(reader); // p.Name == "李四" 李四 30
注意事项与替代方案
XmlSerializer 是轻量、声明式、适合配置类或数据传输的首选。但它不支持循环引用,也不处理 DateTimeOffset 或匿名类型。遇到以下情况可考虑其他方式:
- 需要序列化字典或复杂类型 → 改用
DataContractSerializer(需加[DataContract]) - 要生成更紧凑或兼容旧系统的XML → 手动用
XmlWriter - 项目已用 JSON 主流 → 可考虑
System.Text.Json或Newtonsoft.Json,再转XML(不推荐,性能差)
[Serializable] 并非必须(XmlSerializer 不依赖它),但加上无害,便于未来扩展。










