C# 自定义xml反序列化运行在一个无休止的循环中
对于我们的软件,我必须更改整个项目的xml序列化。 几个小时后,我发现如果实现接口C# 自定义xml反序列化运行在一个无休止的循环中,c#,.net,xml,serialization,C#,.net,Xml,Serialization,对于我们的软件,我必须更改整个项目的xml序列化。 几个小时后,我发现如果实现接口IXmlSerializable,就可以修改xml序列化 在阅读了一些关于如何正确实现此接口的内容之后,我已经将其实现到实体中 实现此接口的实体是一个子类。父类将序列化为xml。如果子类只是一个普通属性,那么序列化是正确的,工作起来就像一个符咒。 但是,如果父类有这个子类的列表,那么序列化将进入一个无休止的循环 下面是一个非常简单的例子来说明我的问题: public class ParentEntity {
IXmlSerializable
,就可以修改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);
}
}
对象parentEntity
已正确初始化。
然后我将对象序列化为xml。
在这之后,我将把xml反序列化回一个对象(只是为了展示)。
这是我的问题。方法ReadXml()
经常被调用。它看起来像一个无止境的循环。我从未到达过的反序列化过程的终点
有人知道我的问题是什么吗?如中所述,该方法负责读取整个元素,包括
开始和结束节点,但不应该这样做,因为包装器元素是由框架本身编写的。如果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);
}
}
公共类子实体:IXmlSerializable
{
公共字符串名称{get;set;}
公共XmlSchema GetSchema()
{
返回null;
}
公共void ReadXml(XmlReader)
{
Name=reader.GetAttribute(“名称”);
reader.Skip();//使用and(如果存在)节点以及其中包含的所有内容。
}
public void WriteXml(XmlWriter)
{
WriteAttributeString(“名称”,名称);
}
}
样品
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);
}
}