我有这个课程:
[DataContract]
class ClassA
{
[DataMember]
public Object Value; // and this can be of ClassB or some primitive type.
...
}
[DataContract]
class ClassB : IEnumerable<KeyValuePair<String, ClassA>>
{
[DataMember]
private Dictionary<String, ClassA> dictionary;
...
}
但在序列化时发生此异常:
输入&#39; MyNamespace.ClassA&#39;与数据合同名称 &#39; ClassA的:http://schemas.datacontract.org/2004/07/MyNamespace&#39;不是 预期。将任何静态未知的类型添加到已知列表中 types - 例如,通过使用KnownTypeAttribute属性或by 将它们添加到传递给的已知类型列表中 DataContractSerializer的。
我觉得我应该使用KnownType
属性,但我无法弄清楚如何,因为我不拥有IEnumerable<T>
。
有人可以帮忙吗?感谢。
答案 0 :(得分:6)
我终于做对了。解决方案非常简单,第一类Value
的类型为Object
,序列化程序必须知道哪些类型将被装入Object
。
因此ClassA
应声明为:
[DataContract]
[KnownType(typeof(ClassA)]
[KnownType(typeof(ClassB)]
class ClassA
{
[DataMember]
public Object Value; // ClassA or ClassB or some primitive type.
...
}
这份文件here确实有助于澄清什么是KnownType
。
答案 1 :(得分:1)
尝试以下方法:
[DataContract]
[KnownType(typeof(int))]
// Same way add here all the types that you are using in your class A.
class ClassA
{
[DataMember]
public int Value;
...
}