【发布时间】:2011-03-22 11:43:01
【问题描述】:
我正在尝试像这样序列化一个类:
[DataContract]
public class GenericFlow
{
[DataMember]
public ISource Source { get; set; }
[DataMember]
public IList<IFilter> Filters { get; set; }
}
当我序列化此对象的实例时,一切正常,但如果我尝试反序列化,则会出现错误。我正在使用 Mono 2.6 进行测试,这是单声道平台上的错误:
Stacktrace:
Native stacktrace:
/usr/bin/mono() [0x48563b]
/usr/bin/mono() [0x4d275f]
/lib/libpthread.so.0(+0xfb40) [0x7fd5f8d6eb40]
/usr/bin/mono(mono_object_get_virtual_method+0x174) [0x4f5744]
/usr/bin/mono() [0x555524]
[0x41632228]
Debug info from gdb:
如果我从源属性中删除 DataMember 属性,反序列化将起作用。
查看序列化过程中生成的 json 字符串,我可以看到过滤器列表中的每个项目都包含一个“__type”属性,用于指定实现 IFilter 的具体类。但是对于缺少属性“__type”的 ISource 类型的属性“Source”则不是这样,因此反序列化过程不知道使用哪个具体类来重新创建该属性。
由于我没有方便的 windows 框,我不知道这是单声道特定问题还是我在这里遗漏了一些东西。
我应该如何告诉 DataContractJsonSerializer 在源属性中包含“__type”属性?
提前致谢,
更新:
再调查一下,现在我可以强制 DataContractJsonSerializer 始终发出类型信息,调用带有 alwaysEmitTypeInformation=true 的构造函数。 但问题仍然存在。有什么想法吗?
【问题讨论】:
-
是的。实现 ISource 的具体类是 DataContract。 ISource 本身不能具有 DataContract 属性,因为它不是一个类(它是一个接口)。谢谢。
-
我记得必须使用 [ServiceKnownType] 属性,但那是在 windows 上。
-
我已将 ServiceKnownType 属性添加到 ISource 中,列出了实现它的具体类。它同样崩溃。
标签: c# json serialization mono datacontractjsonserializer