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

C# 在C中用XML序列化多个对象的方法#,c#,xml-serialization,C#,Xml Serialization,XML序列化相同/不同类型的多个对象的不同方式有哪些 例如,相同类型对象的通用列表 和不同类型对象的ArrayList 另外,哪些类型的结构是XML可序列化的,哪些不是 如果任何人都能提供示例代码或链接,这将非常有用。您可以让所有类实现System.Xml.Serialization.IXmlSerializable。然后,您可以拥有这种类型的泛型集合。实现所需的ReadXml和WriteXml方法非常简单 e、 g 用法 class WorkerClass { public void Se

XML序列化相同/不同类型的多个对象的不同方式有哪些

例如,相同类型对象的通用
列表
和不同类型对象的ArrayList

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


如果任何人都能提供示例代码或链接,这将非常有用。

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

e、 g

用法

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();
    }
  }
}
class-worker类
{
public void serializeListFile(IList列表,字符串文件名)
{
使用(XmlWriter=新的XmlTextWriter(文件名))
{
foreach(列表中的IXmlSerializable项)
item.WriteXml(编写器);
writer.Close();
}
}
}

这里是一个链接。但是Chris Arnold是对的,实现
IXmlSerializable
将允许您完全控制序列化。Xml属性之所以吸引人,是因为它们是声明性的,但另一个选项值得学习(根据我的经验,速度更快)。

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

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

  • 单个混凝土实体是好的
  • 具体的列表/数组(
    List
    T[]
    等)处理得很好
  • 但它将与接口、字典和各种泛型场景(列表除外)斗争
您是对的,
List
可以序列化一组相似的对象。如果您处理的是子类,那么可以使用
[xmlclude]
来区分类型;i、 e.如果您有:

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 {}
(您也可以在ctor中指定此关系到
XmlSerializer
,但这是额外的工作)

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


我也不建议序列化任意对象类型的列表;如果您有一组有限的已知类型,那么可以使用
[xmlclude]
等技巧来实现这一点。

无参数构造函数不必是公共的。
[XmlInclude(typeof(Child))]
public class Parent {}

public class Child : Parent {}