2

我正在尝试像这样序列化一个类:

[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 字符串,我可以看到 Filters 列表中的每个项目都包含一个“__type”属性,用于指定实现 IFilter 的具体类。但是对于缺少属性“__type”的 ISource 类型的属性“Source”,情况并非如此,因此反序列化过程不知道使用哪个具体类来重新创建该属性。

由于我没有方便的 Windows 框,我不知道这是否是单声道特定问题,或者我在这里遗漏了一些东西。

我应该如何告诉 DataContractJsonSerializer 在源属性中包含“__type”属性?

提前致谢,

更新:

再调查一下,现在我可以强制 DataContractJsonSerializer 始终发出类型信息,调用带有 alwaysEmitTypeInformation=true 的构造函数。但问题仍然存在。有任何想法吗?

4

1 回答 1

0

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

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

于 2011-03-22T18:29:48.290 回答