0

テストクラスは次のとおりです。

    [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>
4

1 に答える 1

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>
于 2016-07-29T00:11:54.820 に答える