繁体   English   中英

XmlSerializer引发System.InvalidOperationException

[英]XmlSerializer throws System.InvalidOperationException

所以基本上我有2节课:

public class Configuration
{
    public Configuration()
    {
        Sections = new List<Section>();
    }

    public List<Section> Sections { get; private set; }
}

public class Section : 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);
    }
}

该代码运行良好:

var configuration = new Configuration();
configuration.Sections.Add(new Section {Name = "#Submitter.LoginTest"});
configuration.Sections.Add(new Section {Name = "Default"});

using (StreamWriter writer = new StreamWriter(@"d:\data.xml"))
{
    XmlSerializer x = new XmlSerializer(typeof(Configuration));
    x.Serialize(writer, configuration, XmlSerializerHelper.EmptyNamespaces);
}

序列化结果:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <Sections>
    <Section Name="#Submitter.LoginTest" />
    <Section Name="Default" />
  </Sections>
</Configuration>

但是,此代码引发异常:System.Xml.dll中发生了类型为'System.InvalidOperationException'的未处理异常。其他信息:XML文档(4、6)中有错误。

var configuration = new Configuration();
using (StreamReader reader = new StreamReader(@"d:\data.xml"))
{
    XmlSerializer x = new XmlSerializer(typeof(Configuration));
    configuration = (Configuration) x.Deserialize(reader);
}

因此,对于Section的序列化,我不能使用基于属性的序列化,但是可以正常工作:

public class Section
{    
    [XmlAttribute]
    public string Name { get; set; }
}

UPD1 :作为根的Section的序列化/反序列化效果很好

这是因为读取器在类Section进行反序列化时不会移至下一个节点,而是反复尝试读取同一节点,最终导致OutofMemory异常。 读取属性后,应将读者指向下一个节点。 可能还有其他方法可以解决此问题,但是此刻应该可以解决您的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM