オブジェクトをシリアル化するために、WCF の外部で DataContractSerializer を使用しようとしています。この場合のオブジェクトは CollectionBase の古いジェネリック ラッパーから継承します。
[KnownType(typeof(Foo)]
[CollectionDataContract]
class FooCollection : MyCollectionBase<Foo>
[KnownType(typeof(FooCollection)]
[KnownType(typeof(Foo)]
[CollectionDataContract]
class MyCollectionBase<T> : CollectionBase
[DataContract]
class Foo
{
[DataMember]
string Name;
[DataMember]
string Value;
}
これをシリアル化すると、次の構造が得られます。
<FooCollection xmlns="http://schemas.datacontract.org/ ...>
<anyType>
<Name>...</Name>
<Value>...</Value>
</anyType>
</ArrayOfAnyType>
デシリアライズすると、次のエラーが表示されます。
System.Runtime.Serialization.SerializationException : 名前空間http://schemas.datacontract.org/2004/07/MyAssemblyの要素 anyType は、オブジェクトとして逆シリアル化される子コンテンツを持つことはできません。このパターンの XML を逆シリアル化するには、XmlNode[] を使用してください。
----> System.Xml.XmlException : 名前空間 'http://schemas.datacontract.org/2004/07/MyAssembly' の終了要素 'anyType' が必要です。名前空間 'http://schemas.datacontract.org/2004/07/MyAssembly' から要素 'Name' が見つかりました。行 1、位置 xxx。
このエラーをグーグルで検索すると、シリアル化を機能させるために継承階層を変更したり、単にアプローチの問題をリストしたりする多くの人々が表示されます。XmlNode[] を使用してこのパターンの XML を逆シリアル化する例を見つけることができませんでした。
だから私の質問は:
- 基になる ArrayList に格納されている型が Foo 型であることを DataContractSerializer に納得させる方法はありますか?
- XmlNode[] 回避策を実装するにはどうすればよいですか?
- 非ジェネリック コレクションに支えられていないジェネリック コレクションを使用する唯一の解決策はありますか?