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 类中其他任何东西的序列化行为。额外的 reader.Read() 是为了确保阅读器在 之后移动到下一个标签,否则在处理完 Answer 后反序列化将不会继续。

它不是 100% 完美,但对于我的实现来说已经足够了。

于 2013-02-14T15:42:33.177 回答