实现IXmlSerializable以处理包含集合的类

6
我需要能够对一个内部类进行Xml序列化,因此必须实现IXmlSerializable接口。
这个类中有两个字符串和一个列表。
我知道可以使用WriteElementString和ReadElementContentAsString来读取和写入字符串。
然而,我不知道如何在ReadXml和WriteXml方法中读取和写入列表。
我该怎么做,或者有没有一种方法可以在维护其内部可访问性的同时序列化和反序列化对象?

你可能会发现这个链接有用,我知道我用过 Shifting Bits - Simon Wilson
1个回答

11

只需编写一个<List>元素作为列表本身,然后循环遍历项目并将它们作为<Item>元素写出。

如果元素是可以进行XML序列化的类的实例,则可以为元素类型创建XmlSerializer实例,然后将每个元素序列化到您已经使用的同一XmlWriter中。例如:


public void WriteXml(XmlWriter writer)
{
    writer.WriteStartElement("XmlSerializable");

    writer.WriteElementString("Integer", Integer.ToString());

    writer.WriteStartElement("OtherList");
    writer.WriteAttributeString("count", OtherList.Count.ToString());

    var otherSer = new XmlSerializer(typeof(OtherClass));
    foreach (var other in OtherList)
    {
        otherSer.Serialize(writer, other);
    }
    writer.WriteEndElement();

    writer.WriteEndElement();
}

public void ReadXml(XmlReader reader)
{
    reader.ReadStartElement("XmlSerializable");

    reader.ReadStartElement("Integer");
    Integer = reader.ReadElementContentAsInt();
    reader.ReadEndElement();

    reader.ReadStartElement("OtherList");
    reader.MoveToAttribute("count");
    int count = int.Parse(reader.Value);

    var otherSer = new XmlSerializer(typeof (OtherClass));
    for (int i=0; i<count; i++)
    {
        var other = (OtherClass) otherSer.Deserialize(reader);
        OtherList.Add(other);
    }

    reader.ReadEndElement();
    reader.ReadEndElement();
}

2
List<>没有实现IXmlSerializable接口,但由于其公共访问权限,它是可序列化的。我理解如何按照上述方式编写它们,但是在代码中如何嵌套列表中的项,以及如何稍后从嵌套中删除它们?我应该查看哪些方法来完成这个任务? - Präriewolf
2
代码中包装元素存在问题,可以参考这里的示例(http://www.codeproject.com/KB/XML/ImplementIXmlSerializable.aspx)来正确实现ReadXml和WriteXml方法。 - jdehaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接