在C#中使用XmlSerializer进行对象序列化时,默认情况下对象的公共属性会被序列化为XML节点的子元素。如果希望将某个属性直接序列化为XML节点的属性而不是子元素,可以通过在属性上添加XmlAttribute特性来实现。这种方式能够生成结构更扁平、更符合某些接口规范的XML文档。

使用XmlAttribute特性
XmlAttribute位于System.Xml.Serialization命名空间,将它标注在属性上,序列化器就会把该属性作为所属类的根节点(或父节点)的属性输出,而不是嵌套的子元素。
示例代码
using System;
using System.Xml.Serialization;
using System.IO;
namespace Demo
{
[XmlRoot("user")]
public class User
{
// 序列化为user节点的属性
[XmlAttribute("id")]
public int Id { get; set; }
// 序列化为user节点的属性
[XmlAttribute("name")]
public string Name { get; set; }
// 默认作为子元素
public string Email { get; set; }
}
class Program
{
static void Main()
{
User user = new User
{
Id = 1,
Name = "张三",
Email = "test@ipipp.com"
};
XmlSerializer serializer = new XmlSerializer(typeof(User));
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, user);
Console.WriteLine(writer.ToString());
}
}
}
}
上述代码运行后输出的XML类似如下内容:
<?xml version="1.0" encoding="utf-16"?> <user id="1" name="张三"> <Email>test@ipipp.com</Email> </user>
忽略不需要序列化的属性
如果某些属性既不希望成为子元素也不希望成为属性,可以使用XmlIgnore特性将其排除在序列化之外。
示例
public class User
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
[XmlIgnore]
public string TempData { get; set; }
public string Email { get; set; }
}
注意事项
- XmlAttribute只能应用于会被序列化的公共属性和字段,且类型需能被XmlSerializer直接处理。
- 同一个类中,如果同时有XmlText和其他子元素,需注意结构冲突问题。
- 若需自定义命名空间,可结合XmlAttribute特性的Namespace参数使用。
通过合理使用XmlAttribute与XmlIgnore,开发者可以精确控制C#对象序列化为XML时的节点结构,将指定属性输出为节点属性而非子元素,从而满足不同场景下的数据交换需求。
C#xml序列化XmlAttribute修改时间:2026-07-30 20:12:22