Исключение во время 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>