自定义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。
感谢您的帮助。现在,一切正常。 –