Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET XmlSerializer和C中的嵌套类#_C#_.net_Xmlserializer_Nested Class - Fatal编程技术网

C# .NET XmlSerializer和C中的嵌套类#

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

我在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约束时,是否有任何文档化的要求在所有外部类型上强制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。