Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义xml反序列化运行在一个无休止的循环中_C#_.net_Xml_Serialization - Fatal编程技术网

C# 自定义xml反序列化运行在一个无休止的循环中

C# 自定义xml反序列化运行在一个无休止的循环中,c#,.net,xml,serialization,C#,.net,Xml,Serialization,对于我们的软件,我必须更改整个项目的xml序列化。 几个小时后,我发现如果实现接口IXmlSerializable,就可以修改xml序列化 在阅读了一些关于如何正确实现此接口的内容之后,我已经将其实现到实体中 实现此接口的实体是一个子类。父类将序列化为xml。如果子类只是一个普通属性,那么序列化是正确的,工作起来就像一个符咒。 但是,如果父类有这个子类的列表,那么序列化将进入一个无休止的循环 下面是一个非常简单的例子来说明我的问题: public class ParentEntity {

对于我们的软件,我必须更改整个项目的xml序列化。 几个小时后,我发现如果实现接口
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);
    }
}