Использование пользовательского сериализатора WCF в Silverlight

В "полной".NET довольно просто поменять сериализатор - либо в конфигурации, либо через пользовательские атрибуты. Тем не менее, я хочу сделать что-то подобное в Silverlight WCF, то есть предоставить другой механизм сериализации. Я предоставил движок (protobuf-net) - мне просто нужно заставить WCF использовать его!

В прошлый раз, когда я смотрел на это (некоторое время назад), хорошие варианты не были очевидны. Мой лучший kludge заключался в том, чтобы показать данные как byte[] или Stream, но это теряет все "mex" доброту. Какой позор, так как все это довольно просто работает в полной версии .NET.

Возможно ли это? Бонусные очки для WP7 тоже:)

Ответы

Ответ 1

Возможно, но это довольно сложно сделать. Класс DataContractSerializerOperationBehavior (где вы обычно заменяете сериализатор путем переопределения метода CreateSerializer) является внутренним в SL, поэтому вы не можете его использовать. Что вам нужно сделать, так это создать IOperationBehavior, который сделал то, что делает DCSOB, а именно, установить IClientMessageFormatter, который клиент будет использовать для преобразования между телом Message (XML Infoset) и параметрами/возвращаемыми значениями. Это означало бы написание кода для переноса/разворачивания параметров из операции в/из объекта Message. Не совсем невозможно, но он должен работать.

Что касается WP7, то он не имеет точек расширяемости, необходимых для этого решения (IOperationBehavior, IClientMessageFormatter) не существует (они были добавлены на SL4, а WP7 примерно совместим с SL3), поэтому я не подумайте, что это возможно - или, по крайней мере, не в общем виде (вы можете объявить все свои операции с объектами Message - Message MyOperation (Message input) - и на этом этапе вы можете напрямую обращаться к сообщению 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.

Ответ 2

В ответ на вопрос Карлоса, поскольку WP7.1 (Mango) совместим с SL4, он может иметь требуемые точки расширяемости.