【问题标题】:DataContractJsonSerializer: Serializing a class with an interface propertyDataContractJsonSerializer:用接口属性序列化一个类
【发布时间】: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


【解决方案1】:

根据我对 DataContractJsonSerializer 和反序列化复杂对象(在 Windows 上)的经验,您需要包含 __type 提示才能使反序列化正常工作。

我的 DataContractJsonSerializer 体验一直在将 JSON 发送到 WCF 服务

【讨论】:

  • 我已经更新了这个问题。现在,我可以在 ISource 属性上发送 __type 属性,但它仍然在 mono_object_get_virtual_method 上出现段错误。我想我会在 Windows 机器上进行一些测试,以了解这是否是单声道特定问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多