C# XmlSerializer用法详解:对象与xml互转

来源:这里教程网 时间:2026-02-21 17:29:09 作者:

在C#开发中,XmlSerializer 是处理对象与XML之间序列化和反序列化的常用工具。它属于 System.Xml.Serialization 命名空间,使用简单、功能强大,适合将 .NET 对象转换为 XML 格式保存或传输,也支持从 XML 还原为对象。

一、基本用法:对象转XML(序列化)

要将一个对象序列化为XML字符串,需确保类是公共的,并具有无参构造函数。以下是一个示例:

public class Person { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } }

使用 XmlSerializer 将 Person 实例转为 XML:

using System.IO; using System.Xml.Serialization; Person person = new Person { Name = "张三", Age = 28, Email = "zhangsan@example.com" }; XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (StringWriter writer = new StringWriter()) { serializer.Serialize(writer, person); string xml = writer.ToString(); Console.WriteLine(xml); }

输出结果类似:

张三28zhangsan@example.com

二、XML转对象(反序列化)

将之前生成的XML字符串还原为 Person 对象:

string xml = @"张三28zhangsan@example.com"; XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (StringReader reader = new StringReader(xml)) { Person restored = (Person)serializer.Deserialize(reader); Console.WriteLine($"姓名:{restored.Name},年龄:{restored.Age}"); }

注意:反序列化时传入的XML必须与目标类结构匹配,否则会抛出异常。

三、控制序列化行为:特性(Attributes)

通过添加特性可以自定义XML输出格式,比如更改节点名、忽略字段、设置命名空间等。

[XmlElement("CustomName")]:指定元素名称 [XmlAttribute]:将属性序列化为XML属性而非子元素 [XmlIgnore]:跳过该字段/属性 [DefaultValue]:默认值不输出到XML [XmlRoot("CustomRoot")]:设置根元素名称

示例:

[XmlRoot("Customer")] public class Person { [XmlElement("FullName")] public string Name { get; set; } [XmlAttribute] public int Age { get; set; } [XmlIgnore] public string Password { get; set; } }

生成的XML如下:

张三

四、处理集合与数组

XmlSerializer 支持 List、T[] 等集合类型。默认情况下,集合会被包装在一个容器元素中。

public class PeopleList { [XmlArray("Items")] [XmlArrayItem("Person")] public List Persons { get; set; } }

这样生成的XML更清晰:

张三李四

使用 XmlArrayXmlArrayItem 可以分别控制集合标签和项标签名称。

五、注意事项与常见问题

类必须有公共无参构造函数,否则序列化失败 只支持公共读写属性(Property),不序列化字段(Field)除非特殊处理 泛型集合如 List 支持良好,但 Dictionary 不被直接支持 避免循环引用,XmlSerializer 不支持对象图中存在循环引用 性能方面:首次序列化较慢(因动态生成程序集),可考虑缓存 XmlSerializer 实例

建议创建 XmlSerializer 实例时复用,避免频繁创建影响性能:

private static readonly XmlSerializer _serializer = new XmlSerializer(typeof(Person)); 基本上就这些。掌握 XmlSerializer 的基本用法和特性控制,就能高效实现对象与XML之间的互转,适用于配置文件、数据交换等场景。

相关推荐