XmlSerializer 不支持匿名类型,因其要求类型为 public 非 sealed、含公共无参构造函数和可读写属性,而匿名类型是 internal sealed、只读且无无参构造函数;推荐使用具名类替代。
C# 中无法直接将匿名类型序列化为 XML,因为 XmlSerializer 要求类型必须有公共无参构造函数、公共可读写属性,且在编译时已知类型(即不能是匿名类型)。匿名类型是编译器生成的内部类,没有无参构造函数,也不支持 XML 序列化特性。
类型XmlSerializer 在运行时通过反射生成临时程序集来实现序列化,它需要:
若需输出类似匿名类型的 XML,推荐以下几种实用方式:
XmlSerializer 序列化JsonDocument,递归构建 XmlDocument 或 XDocument
假设你原本写的是:
var data = new { Name = "Alice", Age = 30 };
改为:
public class Person { public string Name { get; set; } = ""; public int Age { get; set; } }
var data = new Person { Name = "Alice", Age = 30 };
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StringWriter();
serializer.Serialize(writer, data);
string xml = writer.ToString(); // 正常输出格式化 XML
可借助 ExpandoObject(它是 IDictionary
ExpandoObject 转为字典XDocument 逐层创建元素与属性(注意处理嵌套、数组、null 值)这种方式绕过了 XmlSerializer 限制,但需自行保证 XML 合法性与结构清晰性。