在Silverlight中使用自定义WCF序列化程序

Mar*_*ell 13 .net silverlight wcf serialization protobuf-net

在"完整".NET中,交换序列化程序非常容易 - 无论是在配置中还是通过自定义属性.但是,我想在Silverlight的WCF中做类似的事情 - 即提供不同的序列化引擎.我将提供引擎(protobuf-net) - 我只需要让WCF使用它!

上次我看到这个(前一段时间)没有明显的好选择.我最好的kludge是将数据公开为byte[]Stream- 但这会失去所有"mex"善良.这是一种耻辱,因为它完全适用于完整的.NET.

这可能吗?WP7的加分点:)

car*_*ira 13

这是可能的,但这很难做到.DataContractSerializerOperationBehavior类(通常通过覆盖CreateSerializer方法替换序列化程序)是SL内部的,因此您无法真正使用它.您需要做的是创建一个执行DCSOB操作的IOperationBehavior - 即设置客户端将用于在Message body(XML Infoset)和操作参数/返回值之间进行转换的IClientMessageFormatter.这意味着编写代码以将操作中的参数包装/解包到Message对象中.并非完全不可能,但应该有效.

至于WP7,它没有此解决方案所需的可扩展点(IOperationBehavior,IClientMessageFormatter)不存在(它们是在SL4上添加的,WP7与SL3大致兼容),所以我认为不可能那里 - 或者至少不是通用的方式(你可以用Message对象声明所有的操作 - Message MyOperation(消息输入) - 并且在那个阶段你可以直接处理消息Infoset(GetReaderAtBodyContents),但这需要在每个操作调用中完成.

更新:好吧,我试过,它也可以在Windows Phone 7(和Silverlight 3)中实现,它只是更难.我使用一对自定义通道重新创建了扩展点.有关如何做到这一点的说明,请访问http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/21/wcf-extensibility-extensibility-in-windows-phone-and-silverlight- 3.aspx.

  • 我决定尝试一下并为SL实现一个自定义序列化器,包括像我上面提到的那样连接它.它不适用于所有合同,但适用于最常见的合同.我在http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/24/wcf-extensibility-custom-serialization-in-silverlight.aspx上对此进行了描述,您可以在http:/下载它/code.msdn.microsoft.com/WCF-Custom-Serialization-3952d79a. (3认同)
  • 而这种额外的努力程度让我充满开放的感激之情,以及我能提供的最大SO利益(500赏金,我需要等待24小时才能获奖) (2认同)
  • 谢谢.我开始沉迷于整个StackOverflow的事情:) (2认同)