DataContractJsonSerializer:使用接口属性序列化类

时间:2011-03-22 11:43:02

标签: c# json serialization mono datacontractjsonserializer

我正在尝试序列化这样的类:

[DataContract]
public class GenericFlow 
{
    [DataMember]
    public ISource Source { get; set; }
    [DataMember]
    public IList<IFilter> Filters { get; set; }
}

当我对这个对象的实例进行seralize时,一切正常,但如果我尝试反序列化,我会收到错误。我正在使用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:

如果我从Source属性中删除DataMember属性,则反序列化工作正常。

看一下序列化过程中产生的json字符串,我可以看到Filters列表中的每个项都包含一个“__type”属性,用于指定实现IFilter的具体类。但是,对于缺少属性“__type”的ISource类型的属性“Source”,情况并非如此,因此desarialization进程不知道哪个具体类用于重新创建属性。

由于我没有方便的窗户盒,我不知道这是单声道特定问题还是我在这里遗漏了一些东西。

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

提前致谢,

更新

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

1 个答案:

答案 0 :(得分:0)

在使用DataContractJsonSerializer和反序列化复杂对象(在Windows上)时,您需要包含__type提示,以便反序列化正常工作。

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