为包含集合的类实现IXmlSerializable

Prä*_*olf 4 c# serialization xml-serialization

我需要能够Xml Serialize一个内部的类,所以我必须实现IXmlSerializable.

这个类有两个字符串和一个List.

我知道使用WriteElementString和ReadElementContentAsString读取和写入字符串.

但是,我迷失了如何在ReadXml和WriteXml方法中读取和写入List.

我该怎么做,或者有没有办法序列化和反序列化对象,同时保持它的内部可访问性?

Joh*_*ers 8

只需<List>为列表本身编写一个元素,然后遍历这些项并将它们作为<Item>元素写出来.

如果元素是可以是XML Serialized的类的实例,那么您可以为元素的类型创建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();
}
Run Code Online (Sandbox Code Playgroud)

  • List <>没有实现IXmlSerializable,因为它是公共访问,所以它是可序列化的.我理解如上所述编写它们,但是如何在代码中将项目嵌入列表中,然后如何在嵌套中将它们从嵌套中删除?我应该考虑采用哪种方法来实现这一目标? (2认同)
  • 此处示例中的代码中的wrapper元素存在问题(http://www.codeproject.com/KB/XML/ImplementIXmlSerializable.aspx解释了如何正确实现ReadXml和WriteXml) (2认同)