序列化期间的异常 - 不期望具有数据协定名称的类型

时间:2015-05-13 09:12:44

标签: c# serialization datacontractserializer

我有这个课程:

[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>

有人可以帮忙吗?感谢。

2 个答案:

答案 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;
    ...
}