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

时间:2011-05-19 21:28:13

标签: .net silverlight wcf serialization protobuf-net

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

上次我看过这个(前一段时间)没有明显的好选择。我最好的 kludge 是将数据公开为byte[]Stream - 但这会失去所有“mex”善良。这是一种耻辱,因为它完全可以在完整的.NET中运行

这可能吗? WP7的奖励积分:)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

除了Carlos的回答,由于WP7.1(Mango)兼容SL4,它可能需要扩展点。