2009-09-23 42 views
2

我们可以通过不同的方式使XML序列化多个相同/不同类型的对象?以XML格式序列化C#中多个对象的方法

例如,针对同一类型的对象 的通用List<T>以及不同类型的对象的ArrayList。

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

如果任何人都可以提供样本代码或链接,这将是有帮助的。

回答

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这种关系,但它是额外的工作)

我不推荐使用IXmlSerializable,除非必须;这很复杂,很难正确。更重要的是;如果您通过SOAP服务使用wsdl生成的代理对象,它根本无法工作*;另一端不会有你的IXmlSerializable实现。

我也不建议序列化任意对象类型的列表;如果你有一个已知类型的有限集合有技巧利用[XmlInclude]等来做到这一点。

+0

无参数构造函数不一定是公共的。 – 2009-10-05 06:25:42

1

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

例如

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(); 
    } 
    } 
} 
0

这里是Xml serialization of collections的链接。但克里斯阿诺德是正确实施IXmlSerializable将允许您完全控制序列化。 Xml属性是有吸引力的,因为它们是声明性的,但另一种选择值得学习(并且从我的经验来看速度更快)。