2016-07-29 2 views
0

Так в основном у меня есть 2 классов:XmlSerializer бросает System.InvalidOperationException

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.InvalidOperationException» произошло в System.Xml.dll Дополнительная информация: В документе 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); 
} 

Так что для сериализации раздела я не могу использовать атрибут на основе сериализации, но она отлично работает:

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

UPD1: сериализации/десериализации раздел как корень работает хорошо

ответ

2

Это связано с тем, что читатель не переходит к следующему узлу при десериализации в классе Section и неоднократно пытается прочитать тот же узел, который в конечном итоге приводит к OutofMemory ex ception. После чтения атрибута следует указать читателю на следующий узел. Могут быть другие способы решения этой проблемы, но это должно решить вашу проблему на данный момент.

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

Спасибо, сэр, что работает. –

Смежные вопросы