Использование собственного сериализатора WCF в Silverlight - PullRequest
13 голосов
/ 20 мая 2011

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

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

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

Ответы [ 2 ]

13 голосов
/ 20 мая 2011

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

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

Обновлено : хорошо, я пытался, и это можно сделать в Windows Phone7 (и Silverlight 3), это намного сложнее. Я воссоздал точки расширения, используя пару пользовательских каналов. Описание того, как это можно сделать, можно найти по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/21/wcf-extensibility-extensibility-in-windows-phone-and-silverlight-3.aspx.

2 голосов
/ 25 мая 2011

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

...