Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF中使用自定义DataContractResolver传输涉及泛型的继承树_C#_.net_Wcf_Datacontract - Fatal编程技术网

C# 在WCF中使用自定义DataContractResolver传输涉及泛型的继承树

C# 在WCF中使用自定义DataContractResolver传输涉及泛型的继承树,c#,.net,wcf,datacontract,C#,.net,Wcf,Datacontract,我有一个WCF服务,其中有接受非泛型基类作为参数的操作 [DataContract] class Foo { ... } 这个基类又被诸如类之类的泛型继承 [DataContract] class Bar<T> : Foo { ... } [DataContract] 酒吧类别:富 { ... } 为了实现这一点,我以前必须为Foo类注册KnownTypes,并让它们包括所有可能的Bar变体(例如Bar,Bar,甚至Bar) 然而,使用.NET4中的DataContractRe

我有一个WCF服务,其中有接受非泛型基类作为参数的操作

[DataContract]
class Foo
{ ... }
这个基类又被诸如类之类的泛型继承

[DataContract]
class Bar<T> : Foo
{ ... }
[DataContract]
酒吧类别:富
{ ... }
为了实现这一点,我以前必须为Foo类注册KnownTypes,并让它们包括所有可能的Bar变体(例如
Bar
Bar
,甚至
Bar

然而,使用.NET4中的DataContractResolver,我应该能够构建一个正确存储(和恢复)类的解析器

我的问题是:

  • DataContractResolver通常只在服务端使用,而不是由客户端使用吗?如果是这样的话,在这种情况下,这有什么用处

  • 写一个DataContractResolver来序列化泛型类型的完全限定类型名,比如
    Bar`1[List`1[string,mscorlib],mscorlib]
    ,我错了吗?客户端上的相同DataContractResolver不能还原这些类型吗


  • 我希望这两方面都能奏效,但我不确定这是个好主意;它需要额外的配置,在Silverlight等上不起作用,但在“full.NET”上可能会起作用,每端都有相同的位。

    不知道DataContractResolver的典型用例是什么,但根据本文()的说法,这应该可以通过“SharedTypeResolver”轻松实现以及共享包含合同的程序集

    请注意:
    因此,虽然这似乎是可能的,但从设计的角度来看,我不太确定这是否是一个好主意,因为这将削弱合同的表达能力。这些类型将破坏契约并破坏与其他编程语言的兼容性,这将导致一个问题,即首先使用像SOAP这样的开放标准是否是正确的解决方案。DataContract用于不共享程序集…

    我以前使用过
    DataContractResolver
    ;以下是我的发现:

  • 客户端和服务器都需要解析器;因为序列化和反序列化在两端进行。显然,使用相同的解析器
  • 类型名称是DataContractSerializer生成的信息的标准部分。但是,它只是类型名,而不是完全(程序集)限定名
  • 基本上,自定义解析器允许您将其作为行为添加到WCF客户端和服务器:

    `foreach (OperationDescription operation in myWCFService.Description.Endpoints[0].Contract.Operations)
        {
          operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
              .DataContractResolver = new MyDataContractResolver();
        }`
    
    `foreach(myWCFService.Description.Endpoints[0].Contract.Operations中的OperationDescription操作)
    {
    operation.Behaviors.Find()操作
    .DataContractResolver=新的MyDataContractResolver();
    }`
    
    对于客户端,您可以执行相同的操作:

          `foreach (var operation in base.ChannelFactory.Endpoint.Contract.Operations)
      {
        operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
            .DataContractResolver = new MyDataContractResolver();
      }`
    
    foreach(base.ChannelFactory.Endpoint.Contract.Operations中的var操作) { operation.Behaviors.Find()操作 .DataContractResolver=新的MyDataContractResolver(); }` 我的解析器从配置的位置动态加载类型,并基于某些属性缓存它们。如果您愿意,我可以提供一些示例代码-这些代码都非常基本


    KnownTypeAttribute(例如,使用提供的方法返回所有已知类型)也可用;但是自定义解析器允许更灵活的方法,例如动态加载类型(例如插件系统)和进行您自己的映射(类型=>类型名称,反之亦然)

    Silverlight 4是否没有访问同一个DataContractResolver的权限?至于第一个问题-当然是双方