Xml序列化器为内部对象奇怪的bug

时间:2015-07-30 15:35:12

标签: c# xml-serialization

我有一个XSD架构,包括一些"简单"零件和更多"复杂"部件(它们不能使用框架属性以正确的方式序列化)。我使用.Net序列化器来处理简单的部件,并通过在内部对象上实现IXmlSerializable接口为更复杂的部件编写自定义序列化器。

当我测试代码时,我只输出" custom"部分反序列化(阅读时)。如果我在" root"上注释引用复杂对象的属性。 class,然后所有简单的序列化发生(读和写)。它接缝表示手工序列化器对序列化进行了所有控制,而不是仅按需要序列化内部对象。在我看来这是一种奇怪的行为,所以bug在哪里?

是否可以仅在内部对象上使用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"类

 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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

重点是用

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

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