2009-09-23 10 views
2

同じ/異なるタイプの複数のオブジェクトをXMLでシリアル化できるさまざまな方法は何ですか?C#で複数のオブジェクトをXMLにシリアライズする方法

たとえば、同じタイプのオブジェクトの場合は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にCTORでこの関係を指定することができますが、それは余分な作業です)

IXmlSerializableを使用することをおすすめします。それは複雑で正しいことが難しいです。さらに重要なことには; SOAPサービス上でwsdl生成のプロキシオブジェクトを使用している場合、**動作しません。もう片方にはあなたのIXmlSerializable実装がありません。

任意のオブジェクトタイプのリストのシリアル化もお勧めしません。 有限集合既知の型の場合は[XmlInclude]などを利用してこれを行う方法があります。

+0

パラメータのないコンストラクタは公開する必要はありません。 –

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ためのリンクです。しかし、Chris ArnoldはIXmlSerializableを実装することで、シリアライズを完全に制御できるようになります。 Xml属性は宣言的ですが、他のオプションは学習価値があり(私の経験よりも速いので)、魅力的です。

関連する問題