同じ/異なるタイプの複数のオブジェクトをXMLでシリアル化できるさまざまな方法は何ですか?C#で複数のオブジェクトをXMLにシリアライズする方法
たとえば、同じタイプのオブジェクトの場合はList<T>
、異なるタイプのオブジェクトの場合は のArrayListです。
また、どのタイプの構造がXMLシリアライズ可能であり、どのタイプが構造化されていないのですか?
サンプルコードまたはリンクを誰でも提供できると便利です。
同じ/異なるタイプの複数のオブジェクトをXMLでシリアル化できるさまざまな方法は何ですか?C#で複数のオブジェクトをXMLにシリアライズする方法
たとえば、同じタイプのオブジェクトの場合は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 {}
(あなたもXmlSerializer
にCTORでこの関係を指定することができますが、それは余分な作業です)
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 serialization of collectionsためのリンクです。しかし、Chris ArnoldはIXmlSerializable
を実装することで、シリアライズを完全に制御できるようになります。 Xml属性は宣言的ですが、他のオプションは学習価値があり(私の経験よりも速いので)、魅力的です。
パラメータのないコンストラクタは公開する必要はありません。 –