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

问题描述:

我们的软件我必须更改我们的项目实例的xml序列化。 几个小时后,我发现,如果你实现了接口IXmlSerializable,你可以修改xml序列化。自定义xml反序列化运行进入无限循环

在阅读了一些关于如何正确实现这个接口的内容之后,我将它实现了到实体中。

实现此接口的实体是一个子类。父类将被序列化为xml。如果孩子班只是一个普通的财产,序列化是正确的,并且像魅力一样工作。 但是,如果父类有这个子类的列表,则序列化结束为无限循环。

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

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

parentEntity已经正确初始化的对象LOGIK。 然后我将这个对象序列化到xml中。 之后,我将xml反序列化为一个对象(仅用于展示)。 这是我的问题。方法ReadXml()非常经常被调用。它看起来像一个无限循环。我从来没有达到的反序列化过程的结束。

有没有人知道我的问题是什么?

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

+0

感谢您的帮助。现在,一切正常。 –