XmlSerializer 通过 XmlRootAttribute 可动态指定根元素名和命名空间,或在类上用 [XmlRoot] 特性静态声明;需配合 XmlSerializerNamespaces 添加前缀,子元素默认继承根命名空间。

XmlSerializer 本身不直接支持在序列化时动态指定根元素名或命名空间——它默认使用类名作为根元素,且无命名空间。但你可以通过构造函数传入 XmlRootAttribute 来显式控制根元素名称、命名空间、是否为空等行为。
用 XmlRootAttribute 指定根元素名和命名空间
这是最常用、最推荐的方式。在创建 XmlSerializer 实例时,把 XmlRootAttribute 作为第二个参数传入:
- rootName 控制序列化后的根元素名(覆盖类名)
-
Namespace 指定 XML 命名空间(如
"http://example.com/ns") -
IsNullable 可选,控制是否生成
xsi:nil="true"
示例:
var root = new XmlRootAttribute("Order");
root.Namespace = "http://mycompany.com/orders";
var serializer = new XmlSerializer(typeof(Order), root);
这样序列化出的 XML 就是:
在类上用 [XmlRoot] 特性静态声明(更简洁)
如果根信息固定,直接在类定义上加 [XmlRoot] 特性更清晰,无需每次 new Serializer 时重复配置:
[XmlRoot("Purchase", Namespace = "https://shop.example/v2")]
public class Order { ... }
// 使用时直接 new 即可
var serializer = new XmlSerializer(typeof(Order));
效果等同于手动传 XmlRootAttribute,且支持 ElementName、IsNullable 等属性。
注意命名空间前缀(如 xmlns:ns)需额外处理
XmlSerializer 默认只写 xmlns="..."(默认命名空间),不自动添加带前缀的命名空间(如 xmlns:ns="...")。如需前缀,得配合 XmlSerializerNamespaces:
- 创建
XmlSerializerNamespaces实例 - 用
Add("ns", "http://example.com")注册前缀与 URI - 在
Serialize()方法中作为参数传入
示例:
var ns = new XmlSerializerNamespaces();
ns.Add("ns", "http://example.com/orders");
serializer.Serialize(writer, order, ns);
// 输出:...
补充:子元素命名空间继承与覆盖
根元素设了命名空间后,其下所有子元素默认继承该命名空间(除非子元素自己用 [XmlElement(Namespace = "...")] 显式覆盖)。如果类里某些字段要属于不同命名空间(比如混合 SOAP 或 xsi 类型),就得单独为属性加特性指定。
基本上就这些。核心就是靠 XmlRootAttribute 控制根,靠 XmlSerializerNamespaces 控制前缀,不复杂但容易忽略细节。










