2016-07-29 14 views
0

Also im Grunde habe ich zwei Klassen:XmlSerializer wirft 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); 
    } 
} 

Dieser Code funktioniert gut:

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); 
} 

Serialisierung Ergebnis:

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

Aber dieser Code löst eine Ausnahme : Eine nicht behandelte Ausnahme vom Typ 'System.InvalidOperationException' ist in System.Xml.dllaufgetretenWeitere Informationen: Im XML-Dokument ist ein Fehler aufgetreten (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); 
} 

Also für die Serialisierung von Abschnitt I nicht attributbasierte Serialisierung verwenden kann, aber es funktioniert völlig in Ordnung:

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

UPD1: Serialisierung/Deserialisierung von Abschnitt als root funktioniert gut

Antwort

2

Es ist, weil der Leser nicht zum nächsten Knoten beim Deserialisieren in der Klasse Section bewegt und wiederholt versucht, den gleichen Knoten zu lesen, der schließlich zu OutofMemory ex führt Aufnahme. Sie sollten den Leser auf den nächsten Knoten zeigen, nachdem Sie das Attribut gelesen haben. Es kann andere Wege geben, dieses Problem zu lösen, aber das sollte Ihr Problem im Moment lösen.

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

Vielen Dank, mein Herr, das funktioniert. –

Verwandte Themen