Xml 内部对象奇怪错误的序列化程序

Xml serializer for inner object strange bug

我有一个 XSD 架构,包括一些 "simple" 部分和更多 "complex" 部分(它们无法使用框架属性以正确的方式序列化)。通过在内部对象上实现 IXmlSerializable 接口,我将 .Net 序列化程序用于简单部分,并为更复杂的部分编写自定义序列化程序。

当我测试代码时,我只得到反序列化的 "custom" 部分的输出(读取时)。如果我在 "root" class 上评论引用复杂对象的 属性,那么所有简单的序列化都会发生(读和写)。手工序列化程序接管了对序列化的所有控制,而不是仅按需要序列化内部对象。对我来说这是一个奇怪的行为,那么错误在哪里??

是否可以仅在内部对象上使用 IXmlSerializable?

这是 "root" class :

public class RootElement
{
    [XmlAttribute("foo")]
    public Foo foo;

    [XmlAttribute("bar")]
    public Bar? bar;

    public bool ShouldSerializeBar()
    {
        return bar.ShouldSerialize;
    }

    [XmlElement("SimpleXml")]
    public SimpleXml simpleXml;

    // commenting these two lines radically change the serialization
    [XmlElement("ComplexXmlWithCustomSerializer")]
    public ComplexXml complexXml;
}

结束这是"ComplexXml"class

 public class ComplexXml : IXmlSerializable
{
    public double pty1;

    public double? pty2;

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        XmlReader reader2 = reader.ReadSubtree();
        while (reader2.Read())
        {
            if (reader2.NodeType == XmlNodeType.Element)
            {
                string unit;
                switch (reader2.Name)
                {
                    case "Pty1":
                        unit = reader2.GetAttribute("unit");
                        if (string.Equals(unit, "mm"))
                            pty1 = double.Parse(reader2.GetAttribute("value"));
                        break;
                    case "Pty2":
                        unit = reader2.GetAttribute("unit");
                        if (string.Equals(unit, "deg"))
                            pty2 = double.Parse(reader2.GetAttribute("value"));
                        break;
                }
            }
            if (reader2.NodeType == XmlNodeType.EndElement)
                reader2.ReadEndElement();
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        //pty1
        writer.WriteStartElement("Pty1");
        writer.WriteAttributeString("unit", "mm");
        writer.WriteAttributeString("value", pty1.ToString());
        writer.WriteEndElement();

        //pty2
        if (pty2.HasValue)
        {
            writer.WriteStartElement("Pty2");
            writer.WriteAttributeString("unit", "deg");
            writer.WriteAttributeString("value", WrapAngle.Value.ToString());
            writer.WriteEndElement();
        }
    }
}

我可以在类似的问题中找到这个问题的答案here

重点是用

结束ReadXml(XmlReader reader)方法
            reader.Read();

我不明白它为什么有效,但是这一行使 reader 能够在自定义方法结束后继续读取 XML 文档...