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

Elv*_*gic 3 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但在序列化时发生此异常:

键入"MyNamespace.ClassA",数据合同名称为"ClassA:http://schemas.datacontract.org/2004/07/MyNamespace ".将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

我觉得我应该使用KnownType属性,但我无法弄清楚如何,因为我不拥有IEnumerable<T>.

有人可以帮忙吗?谢谢.

Elv*_*gic 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.
    ...
}
Run Code Online (Sandbox Code Playgroud)

本文在这里真的帮助澄清什么KnownType.


小智 2

请尝试以下操作:

[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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么 `[KnownType(typeof(int))]` 在什么时候会有帮助?`System.Int32` 始终是已知类型。 (3认同)