2011-11-04 9 views
3

genericsのリストを含むクラスをxmlにシリアル化する方法があるのだろうか?C#:ジェネリックのリストを含むクラスのXMLシリアル化

class Program 
{ 
    static void Main(string[] args) 
    { 
     var o = new ContainerClass(); 
     o.Values = new List<SomeClass> {new SomeClass<int>(), new SomeClass<long>()}; 

     XmlSerializer xs = new XmlSerializer(typeof(ContainerClass)); 
     MemoryStream buffer = new MemoryStream(); 
     using (TextWriter writer = new StreamWriter(buffer)) 
     { 
      xs.Serialize(writer, o); // InvalidOperationException here 
     } 
     var xml = Encoding.UTF8.GetString(buffer.ToArray()); 
    } 
} 

public class ContainerClass 
{ 
    public List<SomeClass> Values { get; set; } 
} 

public class SomeClass 
{ 
} 

public class SomeClass<T> : SomeClass 
{ 
} 

私はシリアライザに余分なタイプを渡す方法があることを知っているが、おそらく表示される可能性今、すべての組み合わせに方法はありません: それはこのようになります。

私はIXmlSerializableをさまざまな方法で成功させることなく実装しようとしました。

どのように対処するのですか?

これを処理できる人がいる場合は、外部ライブラリも開いています。

+0

IXMLSerializableでジェネリック制約を設定するのがうまくいくのだろうかと思います。例えば ​​'public class SomeClass :SomeClass where T:IXMLSerializable ....'(すべてがシリアライズ可能であることを確認してください) –

+0

違いはありません。しかし、.NET Framework用のもう1つのXMLシリアル化ライブラリがこの仕事をしているように思えます。 – Krzysztof

答えて

1

いくつかのライブラリを試した後、私は自分自身をコーディングすることを決めた:

Atlas Xml Serializer

はバイナリフォルダの下のdllを取得し、あなたのプロジェクトに追加します。次に、あなたのコードは次のように動作するはずです:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var o = new ContainerClass(); 
     o.Values = new List<SomeClass> {new SomeClass<int>(), new SomeClass<long>()}; 

     var xml = Atlas.Xml.Serializer.Serialize(o, true); 
    } 
} 

public class ContainerClass 
{ 
    public List<SomeClass> Values { get; set; } 
} 

public class SomeClass 
{ 
} 

public class SomeClass<T> : SomeClass 
{ 
} 

出力は次のようになります。

<ContainerClass> 
    <Values> 
     <item _type="WinformsTestApp.SomeClass`1[[System.Int32]], WinformsTestApp" /> 
     <item _type="WinformsTestApp.SomeClass`1[[System.Int64]], WinformsTestApp" /> 
    </Values> 
</ContainerClass> 

PS:WinformsTestAppは私のテストappilcations名なので、それはあなたのアセンブリ名を反映するために変更します。