我正在尝试在 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不能将子内容反序列化为对象。请使用 XmlNode[] 反序列化这种 XML 模式。
----> System.Xml.XmlException:预期来自命名空间“http://schemas.datacontract.org/2004/07/MyAssembly”的结束元素“anyType”。从命名空间“http://schemas.datacontract.org/2004/07/MyAssembly”中找到元素“名称”。第 1 行,位置 xxx。
谷歌搜索此错误显示许多人更改了他们的继承层次结构以使序列化工作,或者只是列出该方法的问题。我找不到任何使用 XmlNode[] 反序列化这种 XML 模式的示例。
所以我的问题是:
- 有没有办法让 DataContractSerializer 相信存储在底层 ArrayList 中的类型是 Foo 类型?
- 如何实现 XmlNode[] 解决方法?
- 是使用不受非泛型集合支持的泛型集合的唯一解决方案吗?