【发布时间】:2010-06-09 22:35:45
【问题描述】:
我有一个实现以下 DataMember 的服务:
[DataMember]
public Dictionary<string, List<IOptionQueryResult>> QueryResultItems { get; set; }
我有从 IOptionQueryResult 继承的“OptionQuerySingleResult”类。现在,我知道我需要让服务“知道” OptionQueryResult 类型,因此尝试以各种方式添加 KnownType:
[KnownType(typeof(Dictionary<string, OptionQuerySingleResult[]>))]
[KnownType(typeof(Dictionary<string, List<OptionQuerySingleResult>>))]
[KnownType(typeof(OptionQuerySingleResult)]
但是,这些方法都不起作用,在客户端我要么反序列化失败,要么服务器简单地中止请求,导致连接中止错误。
有没有人知道什么是让它工作的正确方法? 我想补充一点,如果我将 QueryResultItems 定义更改为使用具体类型而不是接口,则一切正常。
谢谢,
汤姆
编辑: 我得到的例外是:
第 1 行位置 524 出错。元素“http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType”包含映射到名称“:OptionQuerySingleResult”的类型的数据。反序列化器不知道映射到此名称的任何类型。考虑使用 DataContractResolver 或将与 'OptionQuerySingleResult' 对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。
但是,当我查看 svcutil 生成的客户端代理时,其中肯定定义了“OptionQuerySingleResult”:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="OptionQuerySingleResult", Namespace="")]
[System.SerializableAttribute()]
public partial class OptionQuerySingleResult : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
【问题讨论】:
标签: c# wcf dictionary