【问题标题】:Implementing IXmlSerializable for Classes Containing Collections为包含集合的类实现 IXmlSerializable
【发布时间】:2010-10-31 15:36:10
【问题描述】:

我需要能够对内部类进行 Xml 序列化,因此我必须实现 IXmlSerializable。

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

我知道使用 WriteElementString 和 ReadElementContentAsString 读写字符串。

但是,我不知道如何在 ReadXml 和 WriteXml 方法中读取和写入列表。

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

【问题讨论】:

  • 你可能会发现这个链接很有用,我知道我做了Shifting Bits

标签: c# serialization xml-serialization


【解决方案1】:

只需为列表本身编写一个<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();
}

【讨论】:

  • List 没有实现 IXmlSerializable,它是可序列化的,因为它是公共访问的。我理解像上面所说的那样编写它们,但是如何在代码中将项目嵌套在列表中,然后如何将它们从嵌套中删除?我应该使用哪些方法来完成此任务?
  • 这里的示例代码中的包装元素存在问题(codeproject.com/KB/XML/ImplementIXmlSerializable.aspx 解释了如何正确实现 ReadXml 和 WriteXml)
猜你喜欢
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多