1

次のようなLevelオブジェクトをシリアル化しようとしています。

public class Level
{
    //Some XmlAtributes

    [XmlElement]
    public List<Question> questions;
}

public class Question
{
    //Some XmlAttributes

    [XmlArray("Answers")]
    public List<string> answers;
}

次のようなXMLファイルに変換します。

<Level time="2">
    <Question type="multiplechoice">
        <Answers correct="b">
            <a>Answer 1</a>
            <b>Answer 2</b>
            <c>Answer 3</c>
            <d>Answer 4</d>
        </Answers>
    </Question>

    <Question>
        ...
    </Question>
</Level>

の下の要素名を除いて、これはすでにシリアル化できます<Answers>。すべてが同じではなく(たとえば<string>、デフォルトで)、各要素がどのように増分された名前を取得するかに注意してください。これは可能ですか?要素の名前を。に変更できることはわかっています[XmlArrayItem("ItemName")]が、これにより、配列内のすべての要素に同じ名前が適用されます。

4

1 に答える 1

0

他の誰かがこれに遭遇した場合、これが私が行った解決策です(IAbstractのヒントに感謝します):

public class Answer : IXmlSerializable
{
    public List<string> list = new List<string>();
    public string this[int pos]
    {
        get
        {
            return list[pos];
        }

        set
        {
            list[pos] = value;
        }
    }

    public void ReadXml ( XmlReader reader )
    {
        reader.ReadToDescendant("a");
        while ( reader.Name != "Answers" )
        {
            if ( reader.IsStartElement() )
            {
                list.Add(reader.ReadElementContentAsString());
            }
        }

        reader.Read();
    }

    public void WriteXml ( XmlWriter writer )
    {
        for ( int i = 0; i < list.Count; i++ )
        {
            writer.WriteElementString(((char)(97 + i)).ToString(), list[i]);
        }
    }

    public XmlSchema GetSchema()
    {
        return(null);
    }
}

Answerには属性があり、Questionクラス内の他の何かのシリアル化動作をオーバーライドする必要がないため、Answerを独自のクラスにしました。追加のreader.Read()は、リーダーがの後に次のタグに移動することを確認するためのものです。そうしないと、Answerを処理した後に逆シリアル化が続行されません。

100%完璧というわけではありませんが、私の実装ではそれで十分です。

于 2013-02-14T15:42:33.177 に答える