我在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时,将引发以下异常:



XmlSerializer在我实际尝试对A.B类型进行序列化时,正尝试对A类型应用序列化约束。但是我的理解是,除了在外部类型实例中对数据的特权访问之外,嵌套类型并不特殊,其行为就像在命名空间中一样。

这种理解是不正确的吗?是否可以说明嵌套类型或XmlSerializer的语义是否证明了这种行为,还是感觉像XmlSerializer中的错误?

特别是关于XmlSerializer语义,是否有任何已记录的要求在应用于嵌套类型时对所有外部类型强制执行XmlSerializer约束?

最佳答案

http://msdn.microsoft.com/en-us/library/vstudio/ms229027%28v=vs.100%29.aspx



因此,如果串行器要与A.B一起使用,则它也需要A的定义。 IEnumerable验证开始的地方。

没关系,B实际上并没有在A中引用任何内容:)

关于c# - .NET XmlSerializer和C#中的嵌套类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10441940/

10-11 15:14