【发布时间】:2012-05-04 02:35:18
【问题描述】:
我在 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 未处理:
要成为 XML 可序列化的,从 IEnumerable 继承的类型必须具有 Add(System.Object) 在其所有级别的实现 继承层次结构。 Test.A 没有实现 Add(System.Object)。
当我实际尝试序列化类型 A.B 时,XmlSerializer 正在尝试对类型 A 应用序列化约束。然而,我的理解是,除了对外部类型实例中的数据的特权访问之外,嵌套类型并不特殊,它的行为就像它在命名空间中一样。
这种理解是否不正确,嵌套类型或 XmlSerializer 的语义是否证明了这种行为的合理性,或者这感觉像是 XmlSerializer 中的错误?
关于 XmlSerializer 语义,是否有任何书面要求在应用于嵌套类型时对所有外部类型强制执行 XmlSerializer 约束?
【问题讨论】:
-
嵌套类型没有问题。您的 A 类没有
B类型的属性。 -
另外,不要使用
new XmlTextWriter()。自 .NET 2.0 以来,这已被弃用。请改用XmlWriter.Create()。 -
很抱歉,您完全错过了我的问题的重点。我没有尝试序列化 A,也没有尝试将 B 序列化为 A 的属性。我试图完全独立于 A 来序列化它。而且我知道 TextWriter 已被弃用。这是一个人为的例子,我试图保持简短。
-
+1 这对我来说就像一个错误。
标签: c# .net xmlserializer nested-class