XML的方法在C#中序列化多个对象

时间:2009-09-23 10:51:42

标签: c# xml-serialization

我们可以通过哪些不同方式对相同/不同类型的多个对象进行XML序列化?

例如,对于相同类型的对象,通用List<T> 和ArrayList用于不同类型的对象。

此外,哪种类型的结构是XML可序列化的,哪些不是?

如果任何人都可以提供示例代码或链接,将会很有帮助。

3 个答案:

答案 0 :(得分:4)

要通过XmlSerializer进行序列化,您的类型必须

  • 公开
  • 有一个公共无参数构造函数
  • 它序列化公共读/写字段和属性(首选属性)

就哪些结构而言;

  • 个别具体实体很好
  • 具体列表/数组(List<T>T[]等)处理得很好
  • 但它会遇到界面,词典和各种泛型场景(除了列表)

你是对的List<T>可以序列化一组相似的对象。如果您正在处理子类,那么[XmlInclude]可用于区分类型;即如果你有:

var list = new List<ParentType>();
list.Add(new ParentType());
list.Add(new ChildType()); // Child : Parent

然后,只要您拥有:

,这仍然可以序列化
[XmlInclude(typeof(Child))]
public class Parent {}

public class Child : Parent {}

(您也可以在XmlSerializer的ctor中指定此关系,但这是额外的工作)

除非必须,否则我不建议使用IXmlSerializable;这是复杂的,很难做对。更重要的是;如果你在SOAP服务上使用wsdl生成的代理对象,它根本不起作用**;另一端不会实现IXmlSerializable

我也不建议序列化任意对象类型的列表;如果你有一个已知类型的有限集,那么可以使用[XmlInclude]等来完成这项工作。

答案 1 :(得分:1)

您可以使所有类实现System.Xml.Serialization.IXmlSerializable。然后,您可以拥有此类型的通用集合。然后,实现所需的ReadXml和WriteXml方法非常简单。

e.g。

class MyClass : IXmlSerializable
{
        public System.Xml.Schema.XmlSchema GetSchema()
        {            
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            //TODO: read logic here...
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            //TODO: write logic here...
        }
}

...用法

class WorkerClass
{
  public void SerializeListToFile(IList<IXmlSerializable> list, string fileName)
  {
    using (XmlWriter writer = new XmlTextWriter(fileName))
    {
      foreach (IXmlSerializable item in list)
        item.WriteXml(writer);

      writer.Close();
    }
  }
}

答案 2 :(得分:0)

以下是Xml serialization of collections的链接。但Chris Arnold正确实现IXmlSerializable将允许您完全控制序列化。 Xml属性很有吸引力,因为它们是声明性的,但另一个选项值得学习(并且从我的经验来看更快)。