我正在尝试序列化一个看起来像这样的Level对象:
public class Level
{
//Some XmlAtributes
[XmlElement]
public List<Question> questions;
}
public class Question
{
//Some XmlAttributes
[XmlArray("Answers")]
public List<string> answers;
}
into和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")]
重命名元素,但这会将相同的名称应用于数组中的所有元素。
答案 0 :(得分: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);
}
}
我做了回答它自己的类,因为它有属性,我不需要覆盖Question类中其他任何内容的序列化行为。额外的reader.Read()用于确保读取器移动到下一个标记之后,否则在处理Answer后反序列化将不会继续。
这不是100%完美,但对于我的实施来说已经足够了。