Исключение во время IXmlSerializable.WriteXml при попытке написать внутренний тег

Вот тестовый класс:

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

Когда я вызываю WriteXml, выдается исключение:

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) 

В примерах в Интернете этот код не вызывает никаких проблем (например, http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly), но для меня он не работает. В чем может быть причина?

Обновление: В конце концов, я бы хотел, чтобы класс был сериализован так:

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

1 ответ

Решение

Я думаю, что ваша проблема может быть больше в том, как вы вызываете сериализатор, чем в том, как реализован код WriteXml. Например, в LINQPad я сделал это:

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

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

И я получил этот вывод:

<?xml version="1.0" encoding="utf-16"?>
<Test attr="cat">
  <InnerTest />
</Test>
Другие вопросы по тегам