自定义xml反序列化进入无限循环

时间:2016-12-06 15:11:22

标签: c# .net xml serialization

对于我们的软件我要改变我们项目的xml序列化。 几个小时后我发现,如果实现接口private void OnChecked(object sender, RoutedEventArgs e) { bool? isChecked = this.toggleButton.IsChecked; toggleButton.IsChecked = null; toggleButton.IsChecked = isChecked; } ,可以修改xml序列化。

在阅读了有关如何正确实现此接口的一些内容后,我已将其实现到实体中。

实现此接口的实体是子类。父类将序列化为xml。如果子类只是一个普通的属性,序列化是正确的,就像一个魅力。 但是,如果父类具有此子类的列表,则序列化将结束为无限循环。

这是一个非常简单的例子来说明我的问题:

IXmlSerializable

这是我用于序列化的logik

public class ParentEntity
{
    public List<ChildEntity> Childs { get; set; } = new List<ChildEntity>();
}

public class ChildEntity: IXmlSerializable
{
    public string Name { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        Name = reader.GetAttribute("Name");
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Name", Name);
    }
}

对象 using (var memoryStream = new MemoryStream()) { var serializer = new XmlSerializer(typeof(ParentEntity)); serializer.Serialize(memoryStream, parentEntity); memoryStream.Position = 0; var deserializedParentEntity = serializer.Deserialize(memoryStream) as ParentEntity; Console.Read(); } 已正确初始化。 然后我将对象序列化为xml。 在此之后,我将xml反序列化为一个对象(仅用于展示)。 这是我的问题。方法parentEntity经常被调用。它看起来像一个无限循环。我从未达到反序列化过程的结束。

有谁知道我的问题是什么?

1 个答案:

答案 0 :(得分:2)

正如Proper way to implement IXmlSerializable中所述,方法ReadXml()负责阅读整个元素,包括<ChildEntity>开始和结束节点,而WriteXml()不应该这样做,因为包装元素是由框架本身编写的。如果ReadXml()没有使读者超过初始元素,那么您将获得您所看到的无限循环。

因此,您的ChildEntity类型应如下所示:

public class ChildEntity : IXmlSerializable
{
    public string Name { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        Name = reader.GetAttribute("Name");
        reader.Skip(); // Consume the <ChildEntity> and </ChildEntity> (if present) nodes and everything contained therein.
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Name", Name);
    }
}

示例fiddle