簡體   English   中英

XML序列化C#中多個對象的方法

[英]Ways to XML serialize multiple objects in C#

XML可以序列化相同/不同類型的多個對象的不同方式有哪些?

例如,Generic List<T>用於相同類型的對象,而ArrayList用於不同類型的對象。

另外,哪種類型的結構可以XML序列化,哪些不能序列化?

如果任何人都可以提供示例代碼或鏈接,這將很有幫助。

要通過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 {}

(您也可以在ctor中指定此關系到XmlSerializer ,但這是額外的工作)

我不建議您使用IXmlSerializable除非您必須這樣做。 這很復雜,很難解決。 更重要的是; 如果您正在通過SOAP服務使用wsdl生成的代理對象,那么“根本不起作用”。 另一端將沒有您的IXmlSerializable實現。

我也不建議序列化任意對象類型的列表。 如果您有一組有限的已知類型,則可以使用[XmlInclude]等技巧來實現。

您可以使所有類都實現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();
    }
  }
}

這是集合的Xml序列化的鏈接。 但是克里斯·阿諾德(Chris Arnold)正確地實現IXmlSerializable將使您可以完全控制序列化。 Xml屬性之所以具有吸引力是因為它們是聲明性的,但是另一個選擇值得學習(根據我的經驗,它更快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM