2009-09-23 70 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屬性是有吸引力的,因爲它們是聲明性的,但另一種選擇值得學習(並且從我的經驗來看速度更快)。