2


1

同じ/異なるタイプの複数のオブジェクトをXMLでシリアライズするための異なる方法は何ですか?

例えば、同じタイプのオブジェクトの場合は汎用の List、異なるタイプのオブジェクトの場合はArrayListです。

また、XMLシリアライズ可能な構造体の種類とそうでないものはありますか。

誰かがサンプルのコードやリンクを提供できれば便利です。

3 Answer


4


`XmlSerializer`を介して直列化できるようにするには、あなたの型は

  • 公開する

  • パラメータなしのパブリックコンストラクタを持つ

  • それは公共の読み書き可能なフィールドとプロパティを直列化します(プロパティが優先されます)

どの構成に関して。

  • 個々の具体的実体は大丈夫です

  • 具象リスト/配列( List、` T [] `など)はうまく処理されます。

  • しかし、それはインターフェース、辞書、そして(リスト以外の)さまざまな総称シナリオと戦うでしょう

あなたは、 `List`が似たようなオブジェクトの集合を直列化するのに適しているのは正しいことです。 サブクラスを扱っているのであれば、 `[XmlInclude]`を使って型を区別することができます。すなわち あなたが持っている場合:

var list = new List(); list.Add(new ParentType()); list.Add(new ChildType()); //子:親

それならあなたが持っている限りこれはまだ直列化可能かもしれません:

[XmlInclude(typeof(Child))]
パブリッククラスParent {}

パブリッククラスChild:Parent {}

(この関係を `XmlSerializer`にコントロールで指定することもできますが、それは余分な作業です)

あなたがしなければならない限り、私は `IXmlSerializable`を使うことを勧めません。それは複雑で正しく理解するのは難しいです。 さらに重要なことには; SOAPサービス上でwsdlで生成されたプロキシオブジェクトを使用している場合は、まったく機能しません。もう一方の端にはあなたの `IXmlSerializable`実装がありません。

任意のオブジェクト型のリストをシリアル化することもお勧めしません。あなたが既知のタイプの_有限集合_を持っているならば、 `[XmlInclude]`などを利用してこれをするためのトリックがあります


1


すべてのクラスにSystem.Xml.Serialization.IXmlSerializableを実装させることができます。 あなたはそれからこのタイプのジェネリックコレクションを持つことができます。 必要なReadXmlメソッドとWriteXmlメソッドを実装するのはとても簡単です。

例えば

クラスMyClass:IXmlSerializable {public System.Xml.Schema.XmlSchema GetSchema(){}

public void ReadXml(System.Xml.XmlReader reader){// TODO:ここでロジックを読みます... }

public void WriteXml(System.Xml.XmlWriter writer){// TODO:ここにロジックを書いてください... }}

使用法…​

クラスWorkerClass {public void SerializeListToFile(IList list、string fileName){using(XmlWriter writer = new XmlTextWriter(fileName)){foreach(リスト内のIXmlSerializable item)item.WriteXml(writer);

writer.Close(); }}}


0


これは コレクションのXMLシリアル化へのリンクです。 しかし、Chris Arnoldが `IXmlSerializable`を正しく実装することで、シリアライゼーションを完全に制御できるようになります。 XML属性は宣言的であるため魅力的ですが、他の選択肢は学ぶ価値があります(そして私の経験からすると速いです)。