C# .NET XmlSerializer和C中的嵌套类#
我在C#中使用XmlSerializer时遇到了一些令人惊讶的行为。考虑下面的代码。C# .NET XmlSerializer和C中的嵌套类#,c#,.net,xmlserializer,nested-class,C#,.net,Xmlserializer,Nested Class,我在C#中使用XmlSerializer时遇到了一些令人惊讶的行为。考虑下面的代码。 public class A : IEnumerable { public class B { [XmlAttribute] public string PropA { get; set; } [XmlElement] public string PropB { get; set; } } public IEnum
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约束时,是否有任何文档化的要求在所有外部类型上强制XmlSerializer约束?这里提出约束的是IEnumerable。如果按照异常的建议添加add方法,那么代码将正常工作。同样,这与XmlSerialization关系不大,与IEnumerable的工作方式关系更大。如果我离开这里,请纠正我。检查
为了更好地讨论这个问题,XmlSerializer对实现IEnumerable或ICollection的类进行了特殊处理 详情如下: 因为嵌套类型被视为声明类型的成员,所以嵌套类型可以访问声明类型中的所有其他成员 因此,如果序列化程序想要使用A.B,它还需要A的定义。IEnumerable验证开始的地方
B实际上没有引用A中的任何内容并不重要:)这可能是序列化运行时中的一个非常困难的问题,但我对这种行为没有很好的解释。我觉得IEnumerable的限制不适用于类B。嵌套类型没有问题。您的类A没有类型为
B
的属性。另外,不要使用new XmlTextWriter()
。自.NET2.0以来,它一直被弃用。请改用XmlWriter.Create()
。很抱歉,您完全没有抓住我问题的重点。我没有尝试序列化A,也没有尝试将B序列化为A的属性。我尝试将其完全独立于A进行序列化。我知道TextWriter的不受欢迎。这是我头脑中虚构的一个例子,我一直试图保持简短。+1我觉得它像一个bug。同样,我知道约束是什么,以及如何解决它。真正的问题是,为什么这个约束被应用到我实际上没有尝试序列化的类型上。我观察到的另一个问题是默认构造函数,尽管我很难通过示例来隔离它。Justin是正确的。这是XML序列化程序中的错误。这与您链接的问题不同。我提供的示例的要点是,实现IEnumerable的类实际上不是要序列化的类。嵌套类正在序列化,并且完全独立。您链接的问题的公认答案的作者似乎也同意这是一个bug。