C#如何序列化对象到XML C#对象XML序列化方法

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

在C#中,最常用且标准的方式是使用 XmlSerializer 类将对象序列化为XML字符串或文件。它要求类具有公共属性、无参构造函数,并支持基本类型和可序列化的引用类型。

基础序列化:用 XmlSerializer 写入XML字符串

只需创建 XmlSerializer 实例,调用 Serialize 方法,配合 StringWriterMemoryStream 即可获得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,传入 TextReaderStream

  • XML结构需与目标类型匹配,否则抛出异常
  • 若XML含未知元素,可加 [XmlAnyElement] 捕获冗余内容
  • 建议用 try-catch 包裹,处理格式错误或类型不匹配
示例:
string xml = "李四30";
var serializer = new XmlSerializer(typeof(Person));
using var reader = new StringReader(xml);
var p = (Person)serializer.Deserialize(reader); // p.Name == "李四"

注意事项与替代方案

XmlSerializer 是轻量、声明式、适合配置类或数据传输的首选。但它不支持循环引用,也不处理 DateTimeOffset 或匿名类型。遇到以下情况可考虑其他方式:

  • 需要序列化字典或复杂类型 → 改用 DataContractSerializer(需加 [DataContract]
  • 要生成更紧凑或兼容旧系统的XML → 手动用 XmlWriter
  • 项目已用 JSON 主流 → 可考虑 System.Text.JsonNewtonsoft.Json,再转XML(不推荐,性能差)
小提示:序列化前确保类标记为 [Serializable] 并非必须(XmlSerializer 不依赖它),但加上无害,便于未来扩展。