在C#开发中,实体类和XML的相互转换是数据持久化、跨系统数据交换场景下的常见需求,比如存储程序配置、导出数据供其他系统读取等。下面我们就通过完整的示例代码,讲解具体的实现方法。

准备工作:定义实体类并添加XML特性
要实现实体类和XML的转换,首先需要定义对应的实体类,并且可以通过System.Xml.Serialization命名空间下的特性,自定义XML的节点名称、属性格式等。我们先定义一个简单的用户实体类:
using System.Xml.Serialization;
// 指定XML的根节点名称,不设置的话默认是类名
[XmlRoot("User")]
public class UserEntity
{
// 指定该属性对应XML的元素节点,可自定义节点名
[XmlElement("UserId")]
public int Id { get; set; }
[XmlElement("UserName")]
public string Name { get; set; }
// 如果该属性不需要序列化到XML中,可以添加XmlIgnore特性
[XmlIgnore]
public string TempData { get; set; }
// 指定该属性作为XML节点的属性存在,而不是子元素
[XmlAttribute("UserLevel")]
public int Level { get; set; }
}实体类序列化为XML字符串
序列化是将实体类对象转换为XML格式的过程,我们使用XmlSerializer类来完成这个操作,具体代码如下:
using System.IO;
using System.Text;
using System.Xml.Serialization;
public class XmlConvertHelper
{
/// <summary>
/// 将实体类序列化为XML字符串
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="entity">实体类对象</param>
/// <returns>XML字符串</returns>
public static string EntityToXml<T>(T entity)
{
if (entity == null)
{
return string.Empty;
}
// 创建XmlSerializer对象,指定要序列化的类型
XmlSerializer serializer = new XmlSerializer(typeof(T));
// 使用StringBuilder存储序列化结果
StringBuilder xmlBuilder = new StringBuilder();
// 创建StringWriter,指定编码为UTF-8
using (StringWriter writer = new StringWriter(xmlBuilder))
{
serializer.Serialize(writer, entity);
}
return xmlBuilder.ToString();
}
}我们可以测试一下这个方法的实际效果:
class Program
{
static void Main(string[] args)
{
UserEntity user = new UserEntity
{
Id = 1,
Name = "张三",
Level = 2,
TempData = "临时数据,不会出现在XML中"
};
string xmlResult = XmlConvertHelper.EntityToXml(user);
Console.WriteLine(xmlResult);
}
}运行后输出的XML内容如下,可以看到TempData属性因为添加了XmlIgnore特性没有被序列化,Level属性作为根节点的属性存在:
<?xml version="1.0" encoding="utf-16"?> <User UserLevel="2"> <UserId>1</UserId> <UserName>张三</UserName> </User>
XML字符串反序列化为实体类
反序列化是从XML字符串还原出实体类对象的过程,同样使用XmlSerializer类实现,代码如下:
using System.IO;
using System.Xml.Serialization;
public class XmlConvertHelper
{
/// <summary>
/// 将XML字符串反序列化为实体类对象
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="xml">XML字符串</param>
/// <returns>实体类对象</returns>
public static T XmlToEntity<T>(string xml)
{
if (string.IsNullOrEmpty(xml))
{
return default(T);
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
// 使用StringReader读取XML字符串
using (StringReader reader = new StringReader(xml))
{
return (T)serializer.Deserialize(reader);
}
}
}同样测试反序列化的效果:
class Program
{
static void Main(string[] args)
{
string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<User UserLevel=""2"">
<UserId>1</UserId>
<UserName>张三</UserName>
</User>";
UserEntity user = XmlConvertHelper.XmlToEntity<UserEntity>(xml);
Console.WriteLine($"Id:{user.Id}, Name:{user.Name}, Level:{user.Level}");
}
}运行后会正确输出实体类的各个属性值,说明反序列化成功。
常见注意事项
- 实体类的属性必须是公共的,否则XmlSerializer无法访问和序列化该属性。
- 如果实体类包含集合类型的属性,默认会序列化为多个子节点,也可以通过
XmlArray和XmlArrayItem特性自定义集合节点的名称。 - XML的编码问题需要注意,如果序列化后的XML需要保存到文件,建议指定编码为UTF-8,避免中文乱码。
- 如果XML结构中包含命名空间,需要在实体类的
XmlRoot特性中指定对应的命名空间,否则反序列化会失败。
保存到文件和从文件读取的扩展
实际场景中经常需要把XML保存到文件或者从文件读取XML,我们可以基于上面的方法做简单扩展:
using System.IO;
using System.Xml.Serialization;
public class XmlConvertHelper
{
/// <summary>
/// 将实体类序列化为XML并保存到文件
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="entity">实体类对象</param>
/// <param name="filePath">文件保存路径</param>
public static void EntityToXmlFile<T>(T entity, string filePath)
{
string xml = EntityToXml(entity);
File.WriteAllText(filePath, xml, Encoding.UTF8);
}
/// <summary>
/// 从XML文件反序列化为实体类对象
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="filePath">XML文件路径</param>
/// <returns>实体类对象</returns>
public static T XmlFileToEntity<T>(string filePath)
{
string xml = File.ReadAllText(filePath, Encoding.UTF8);
return XmlToEntity<T>(xml);
}
}以上就是C#中实现实体类和XML相互转换的完整方法,开发者可以根据实际需求调整实体类的特性和转换逻辑,适配不同的业务场景。
C#XML序列化实体类转换XmlSerializer修改时间:2026-05-29 14:29:38