Xml序列化是将程序中的对象实例转换为可扩展标记语言格式的过程,对应的反序列化则是将Xml格式数据还原为对象实例的操作,这种机制在数据存储、跨系统数据交互场景中应用十分广泛。
Xml序列化的核心概念
Xml序列化本质是将对象的公共属性和字段转换为符合Xml规范的元素和属性,序列化过程不会处理对象的私有成员,也不会保留对象的类型信息之外的额外状态。反序列化时需要根据Xml结构匹配对应的对象类型,才能正确还原对象数据。
常用序列化特性
在C#中使用XmlSerializer进行序列化时,可以通过特性控制序列化结果的结构,常用的特性如下:
- XmlElement:指定属性序列化为Xml元素
- XmlAttribute:指定属性序列化为Xml属性
- XmlRoot:指定根元素的名称
- XmlIgnore:标记该属性不参与序列化
C#实现Xml序列化与反序列化
定义待序列化的实体类
首先定义一个简单的用户实体类,使用相关特性控制序列化后的Xml结构:
using System;
using System.Xml.Serialization;
// 指定根元素名称为User
[XmlRoot("User")]
public class UserEntity
{
// 序列化为Xml属性
[XmlAttribute("Id")]
public int Id { get; set; }
// 序列化为Xml元素
[XmlElement("UserName")]
public string Name { get; set; }
// 序列化为Xml元素
[XmlElement("UserAge")]
public int Age { get; set; }
// 该属性不参与序列化
[XmlIgnore]
public string Password { get; set; }
}
实现序列化方法
编写将对象序列化为Xml字符串的方法:
using System.IO;
using System.Text;
using System.Xml.Serialization;
public static string SerializeToXml<T>(T obj)
{
if (obj == null)
{
return string.Empty;
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
// 使用UTF8编码避免中文乱码
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, obj);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
实现反序列化方法
编写将Xml字符串还原为对象的方法:
using System.IO;
using System.Text;
using System.Xml.Serialization;
public static T DeserializeFromXml<T>(string xml)
{
if (string.IsNullOrEmpty(xml))
{
return default(T);
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
return (T)serializer.Deserialize(stream);
}
}
调用示例
创建对象并执行序列化和反序列化操作:
class Program
{
static void Main(string[] args)
{
// 创建测试对象
UserEntity user = new UserEntity
{
Id = 1,
Name = "张三",
Age = 25,
Password = "123456"
};
// 执行序列化
string xmlResult = SerializeToXml(user);
Console.WriteLine("序列化结果:");
Console.WriteLine(xmlResult);
// 执行反序列化
UserEntity deserializedUser = DeserializeFromXml<UserEntity>(xmlResult);
Console.WriteLine("反序列化结果:");
Console.WriteLine($"Id:{deserializedUser.Id}, Name:{deserializedUser.Name}, Age:{deserializedUser.Age}");
}
}
注意事项
使用XmlSerializer时需要注意以下几点:
- 待序列化的类必须有无参构造函数,否则会抛出异常
- 只有公共的属性和字段会被序列化,私有成员无法被处理
- 如果类的属性是只读的,默认不会被序列化,需要额外配置
- 序列化集合类型时,需要指定集合元素的类型,避免反序列化失败
如果遇到复杂的对象结构,比如包含嵌套对象或者集合属性,只需要保证嵌套的对象类型也符合序列化的要求,XmlSerializer会自动处理层级结构,生成对应的嵌套Xml元素。
Xml序列化Xml反序列化C#XmlSerializer修改时间:2026-07-09 22:03:27