2016-07-28 3 views
0

Hier zu schreiben versucht, eine Testklasse:Ausnahme während IXmlSerializable.WriteXml wenn einen inneren Tag

[XmlRoot("Test")] 
    class Test : IXmlSerializable 
    { 
     public string Attr { get; set; } 
     // ... more properties here... 

     public XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(XmlReader reader) 
     { 
      throw new NotImplementedException(); 
     } 

     public void WriteXml(XmlWriter writer) 
     { 
      writer.WriteAttributeString("attr", Attr); 
      writer.WriteStartElement("InnerTest"); // <-- exception 
      // ... write inner stuff 
      writer.WriteEndElement(); 
     } 
    } 

Als ich WriteXml nenne, wird eine Ausnahme ausgelöst:

Index was outside the bounds of the array. 
    at System.Xml.XmlTextWriter.WriteEndStartTag(Boolean empty) 
    at System.Xml.XmlTextWriter.AutoComplete(Token token) 
    at System.Xml.XmlTextWriter.WriteStartElement(String prefix, String localName, String ns) 
    at System.Xml.XmlWriter.WriteStartElement(String localName) 
    at Tests.Test.WriteXml(XmlWriter writer) 

In den Beispielen im Internet Dieser Code verursacht keine Probleme (zB http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly), aber für mich funktioniert es nicht. Was kann der Grund sein?

Update: Schließlich ich die Klasse möchte wie diese serialisiert werden:

<Test attr="..."><InnerTest>...</InnerTest></Test> 

Antwort

1

Ich denke, Ihr Problem mehr sein kann, wie Sie den Aufruf der Serializer als, wie der WriteXml Code ist implementiert. Zum Beispiel in LINQPad habe ich dies:

Test t = new Test() { Attr = "cat" };  

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Test));  
StringWriter w = new StringWriter(); 
xmlSerializer.Serialize(w, t); 
w.ToString().Dump(); 

Und erhielt ich diese Ausgabe:

<?xml version="1.0" encoding="utf-16"?> 
<Test attr="cat"> 
    <InnerTest /> 
</Test> 
+1

die Tat, ich rufe WriteXml direkt und offensichtlich, dass eine falsche Art und Weise war die Serialisierung zu testen. Vielen Dank! – Vlad

Verwandte Themen