我在 C# 中使用 XmlSerializer 遇到了一些令人惊讶的行为。考虑以下代码。
public class A : IEnumerable
{
public class B
{
[XmlAttribute]
public string PropA { get; set; }
[XmlElement]
public string PropB { get; set; }
}
public IEnumerator GetEnumerator ()
{
yield break;
}
}
class Program
{
static void Main (string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(A.B));
XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
}
}
在这个例子中,我尝试序列化嵌套类 AB 的一个实例,它本身并没有以任何方式使用容器类 A。但是当我尝试为其构造 XmlSerializer 时,会引发以下异常:
InvalidOperationException 未处理:
要实现 XML 可序列化,从 IEnumerable 继承的类型必须在其继承层次结构的所有级别上都有 Add(System.Object) 的实现。Test.A 没有实现 Add(System.Object)。
XmlSerializer 正在尝试对 A 类型应用序列化约束,而我实际上是在尝试序列化类型 AB 但是我的理解是,除了对外部类型实例中的数据的特权访问之外,嵌套类型并不特殊,并且表现得好像它是在命名空间中。
这种理解是否不正确,嵌套类型或 XmlSerializer 的语义是否证明了这种行为,或者这感觉像是 XmlSerializer 中的错误?
具体到 XmlSerializer 语义,是否有任何书面要求在应用于嵌套类型时对所有外部类型强制执行 XmlSerializer 约束?