【问题标题】:WCF issues with KnownType for Dictionary字典的 KnownType 出现 WCF 问题
【发布时间】: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


    【解决方案1】:

    我想你会使用:

    [KnownType(typeof(OptionQuerySingleResult)]
    

    但您还需要在 OptionQuerySingleResult 类上使用 [DataContract(Name = "OptionQuerySingleResult")]

    我认为这也依赖于 SVCUTIL.EXE 工具生成的客户端代理类。

    【讨论】:

    • 不幸的是,这似乎也不起作用。奇怪的是,如果我添加 [KnownType(typeof(OptionQuerySingleResult)] 并返回 IOptionQueryResult 列表,而不是字典,它就可以正常工作。
    【解决方案2】:

    您只需将以下属性添加到您的数据合同类。

    [DataMember]
    public object UsedForKnownTypeSerializationObject;
    

    所以现在生成的代理包含您在数据合同上设置的 Knowtypes。 我有同样的问题,这是我想出的唯一解决方案。 如果您的 DataContract 类没有 Object 类型的属性, 生成的代理不包含声明的knowtypes

    例如:

    [DataContract]
    [KnownType(typeof(List<String>))]
    public class Foo
    {
        [DataMember]
        public String FooName { get; set; }
    
        [DataMember]
        public IDictionary<String, Object> Inputs { get; set; }
    
        [DataMember]
        private Object UsedForKnownTypeSerializationObject{ get; set; }
    
    }
    

    它不那么漂亮,因为你最终得到了一个没有任何属性的虚拟属性 功能实现。但话又说回来,我没有其他解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2021-03-13
      相关资源
      最近更新 更多