使用[XmlAttribute]可将属性序列化为XML属性,仅支持基元类型、枚举和Nullable类型,可通过参数自定义属性名和命名空间,复杂类型不适用。

在 C# 中使用 XmlSerializer 进行序列化时,默认会将对象的属性作为 XML 的子元素输出。如果你希望将某个属性序列化为 XML 节点的属性(attribute) 而不是子元素(element),需要使用 [XmlAttribute] 特性。
使用 [XmlAttribute] 将属性序列化为 XML 属性
给目标属性加上 [XmlAttribute] 特性,即可让 XmlSerializer 将其输出为 XML 节点的属性。
示例代码:
假设有如下类:
using System;
using System.Xml.Serialization;
[XmlRoot("Person")]
public class Person
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
// 这个会作为子元素
public string Email { get; set; }
}序列化代码:
var person = new Person
{
Id = 123,
Name = "Alice",
Email = "alice@example.com"
};
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StringWriter();
serializer.Serialize(writer, person);
Console.WriteLine(writer.ToString());输出的 XML 结果为:
```xml可以看到,Id 和 Name 成为了
注意事项
[XmlAttribute] 只能用于某些简单类型,如:
- 基元类型(int、string、bool、double 等)
- 枚举
- Nullable 类型
不能用于复杂对象或集合,否则会抛出异常。
例如,以下写法是错误的:
```csharp [XmlAttribute] public Address HomeAddress { get; set; } // ❌ 复杂类型不能作为 XML 属性 ```控制属性名称和命名空间
你可以自定义属性名或指定命名空间:
- [XmlAttribute("customName")] —— 指定属性名为 customName
- [XmlAttribute(Namespace = "http://example.com")] —— 指定命名空间
例如:
```csharp [XmlAttribute("uid", Namespace = "http://schemas.example.com/user")] public int UserId { get; set; } ```总结
要将对象属性序列化为 XML 节点的属性,只需:
- 使用 [XmlAttribute] 特性标记属性
- 确保属性类型是支持的简单类型
- 可选地指定属性名或命名空间
基本上就这些,不复杂但容易忽略。






