在C#开发中,将对象的公有属性自动生成XML是数据交互场景的常见需求,不需要手动拼接XML节点,通过内置的序列化功能即可快速实现。

核心实现原理
C#提供了System.Xml.Serialization.XmlSerializer类,专门用于对象的XML序列化操作。它会自动扫描对象的公有属性,将属性名作为XML节点名,属性值作为节点内容,生成符合规范的XML字符串。需要注意的是,只有公有可读写属性才会被默认序列化,私有属性、只读属性不会被处理。
基础实现步骤
1. 定义待序列化的对象类
首先需要定义包含公有属性的类,如果需要自定义XML的节点名称、命名空间等,可以添加XmlRoot、XmlElement等特性。
using System;
using System.Xml.Serialization;
// 根节点特性,指定XML根元素名称
[XmlRoot("UserInfo")]
public class User
{
// 指定对应XML节点名称
[XmlElement("UserId")]
public int Id { get; set; }
[XmlElement("UserName")]
public string Name { get; set; }
// 不添加特性时,节点名默认和属性名一致
public int Age { get; set; }
// 私有属性不会被序列化
private string Password { get; set; }
// 只读属性不会被序列化
public string Role => "User";
}
2. 编写序列化方法
通过XmlSerializer的Serialize方法将对象转换为XML,通常需要借助StringWriter或者Stream来接收生成的XML内容。
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public class XmlGenerator
{
public static string ObjectToXml<T>(T obj)
{
if (obj == null)
{
return string.Empty;
}
// 创建XML序列化器,指定对象类型
XmlSerializer serializer = new XmlSerializer(typeof(T));
// 使用StringWriter接收XML内容,指定编码为UTF8
using (StringWriterWithEncoding writer = new StringWriterWithEncoding(Encoding.UTF8))
{
// 配置XML写入设置,去除默认命名空间
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
// 执行序列化
serializer.Serialize(writer, obj, namespaces);
return writer.ToString();
}
}
}
// 自定义StringWriter,支持指定编码
public class StringWriterWithEncoding : StringWriter
{
private readonly Encoding _encoding;
public StringWriterWithEncoding(Encoding encoding)
{
_encoding = encoding;
}
public override Encoding Encoding => _encoding;
}
3. 调用示例
创建对象实例后调用上述方法,即可得到对应的XML字符串。
using System;
class Program
{
static void Main(string[] args)
{
User user = new User
{
Id = 1001,
Name = "张三",
Age = 25
};
string xmlResult = XmlGenerator.ObjectToXml(user);
Console.WriteLine(xmlResult);
}
}
上述代码执行后输出的XML内容如下:
<?xml version="1.0" encoding="utf-8"?> <UserInfo> <UserId>1001</UserId> <UserName>张三</UserName> <Age>25</Age> </UserInfo>
常见问题与注意事项
- 如果对象的公有属性是复杂类型(如自定义类、集合),只要该类型也支持XML序列化,就会被自动处理为嵌套节点。
- 如果属性值为null,默认情况下对应的XML节点会正常生成,但是节点内容为空,也可以通过特性配置是否序列化null值。
- 序列化时如果对象包含循环引用,会直接抛出异常,需要提前处理对象结构避免循环引用。
- 如果需要将生成的XML保存到文件,只需要将
StringWriter替换为StreamWriter,指向对应的文件路径即可。
总结
通过XmlSerializer实现C#对象公有属性自动生成XML是非常高效的方式,不需要手动拼接字符串,减少了出错概率。只需要定义好对象类,调用序列化方法即可完成转换,同时可以通过特性灵活调整生成的XML结构,满足不同的业务需求。
C#XML序列化公有属性Object_to_XMLSystem_Xml_Serialization修改时间:2026-07-13 09:21:21