在“完整”.NET中,交换序列化程序非常容易 - 无论是在配置中还是通过自定义属性。但是,我想在Silverlight的WCF中做类似的事情 - 即提供不同的序列化引擎。我将提供引擎(protobuf-net) - 我只需要让WCF使用它!
上次我看过这个(前一段时间)没有明显的好选择。我最好的 kludge 是将数据公开为byte[]
或Stream
- 但这会失去所有“mex”善良。这是一种耻辱,因为它完全可以在完整的.NET中运行。
这可能吗? WP7的奖励积分:)
答案 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,它可能需要扩展点。