Как использовать protobuf-net в сгенерированном сервисе Silverlight WCF
Я пытаюсь использовать protobuf-net в приложении WCF/Silverlight для повышения производительности сериализации массива больших объектов. Я могу сериализовать / десериализовать классы (добавлен Order= и т. Д.) В коде сервиса.
Но когда я пытаюсь применить ProtoBehavior и вызываю метод службы с поддержкой protobuf из Silverlight, я получаю пустые значения вместо данных (или ошибок).
Я думаю это потому что:
- ProtoBehavior теряется в сгенерированном Silverlight сервисном коде;
- Классы (типы) домена не входят в повторно используемую сборку, они восстанавливаются на клиенте, и Order= теряется.
Однако в настоящее время я не могу изменить обе точки. Есть ли способ использовать protobuf-net без рефакторинга (довольно большого) проекта для совместного использования сборки ASP.NET/Silverlight с классами домена и т. Д.?
Я даже думаю, что будет проще настроить Reference.cs, чтобы добавить недостающее поведение и Order= соответствующим участникам (через скрипт perl/regex), если нет другого решения, но что именно мне нужно настроить, и будет ли оно работать?
1 ответ
Ре [ProtoBehavior]
В Silverlight просто отсутствуют точки расширения, которые мы можем использовать, чтобы молча внедрить альтернативный сериализатор в WCF, что является проблемой. Единственные способы сделать это в настоящее время с помощью Silverlight - это бросить byte[]
или Stream
по проводу и обработайте сериализацию / десериализацию на двух концах.
ре Order=...
стоило бы проверить содержимое; если они приходят с разными номерами, есть способы исправить это с помощью partial class
- мерзкий взлом, но IIRC есть ProtoPartialMember
(или аналогичный), который может быть применен к классу, но который говорит об отдельном члене (свойство / поле). Вы можете исправить номер таким образом. Также есть Offset
(IIRC, извините - нет кода для передачи) на [ProtoContract]
что также может помочь, если у вас есть большое количество полей.
В v2 (не выпущено) вы можете гораздо лучше контролировать порядок (/ номера полей) без необходимости связываться с атрибутами.