我在使用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" });
}
}
在这个例子中,我试图对嵌套类A.B的实例进行序列化,但它本身没有以任何方式使用容器类A。但是当我尝试为其构造XmlSerializer时,会抛出以下异常:“InvalidOperationException was unhandled:”
“To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. Test.A does not implement Add(System.Object).”
XmlSerializer正试图针对类型A应用序列化约束,而我实际上正在尝试序列化类型A.B。然而,我的理解是,除了可以特权地访问外部类型的实例数据之外,嵌套类型并没有什么特别之处,并且表现得好像它在命名空间中一样。
这个理解是不正确的吗?嵌套类型或XmlSerializer的语义是否可以证明这种行为,还是这感觉像是XmlSerializer中的一个错误?
具体关于XmlSerializer的语义,是否有任何记录的要求,在应用于嵌套类型时强制执行XmlSerializer约束的所有外部类型?
new XmlTextWriter()
。自 .NET 2.0 起已被弃用。请改用XmlWriter.Create()
。 - John Saunders