Добавление сериализации protobuff-net в WCF с помощью кода с известными типами

#wcf #protobuf-net

#wcf #protobuf-net

Вопрос:

В настоящее время все мои соединения с WCF определены в коде, и я пытаюсь включить сериализацию protobuff-net с небольшим успехом. Ни один из моих контрактов не отмечен атрибутом knowntype, поскольку у нас есть базовое сообщение с полезной нагрузкой (это были бы десятки knowntypes). Мы вычисляем известные типы, которые у нас есть, и кэшируем их в классе, производном от DataContractSerializerOperationBehavior. Затем в переопределенной функции CreateSerializer я передаю кэшированные известные типы в DataContractSerializer следующим образом

  public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns,   IList<Type> knownTypes)
 {
          new DataContractSerializer(type, name, ns, m_Known ?? knownTypes, 0x7FFF, ...)
 }
  

Есть ли какой-нибудь способ передать список известных типов сериализатору protobuf-net. Я понимаю, что protobuf-net не предназначен для зеркального отображения сериализаторов для WCF, но было бы неплохо, если бы они следовали шаблону, позволяющему переопределять список knowntypes. Спасибо за любую помощь.

Однако у меня нет возможности обрабатывать сериализатор Protobuf-net таким образом (я посмотрел на ProtoOperationBehavior). Есть ли способ не иметь известных типов, указанных в

Ответ №1:

В «v2» доступные подтипы могут быть определены (с использованием RuntimeTypeModel) «на лету» во время выполнения через .AddSubType(...) (фактически, все атрибуты теперь служат только конфигурацией по умолчанию для модели типа, которая может быть настроена любым способом).

Однако я должен подчеркнуть, что v2 в настоящее время находится в бета-версии, и, как отмечено в блоге, перехваты WCF в настоящее время не включены в бета-версию, просто пока я заканчиваю проверку и т.д. Однако я ожидаю, что с вашей настройкой, как показано в вопросе, это должно быть тривиально (это будет просто случай передачи модели в XmlObjectSerializer предоставленную реализацию).

Комментарии:

1. Привет, Марк, спасибо за быстрый ответ. Я загрузил текущее хранилище и, по крайней мере, с текущим кодом, я думаю, у меня возникнут некоторые проблемы (я не уверен, на чем основана версия v2 в downloads). Я не могу создать сериализатор самостоятельно, поскольку XmlProtoSerializer является закрытым для сборки (вы получаете к нему доступ через отражение), и я не могу использовать ProtoOperationBehavior как его внутренний и запечатанный. Если бы любая из этих вещей была false, я мог бы добавить это, но у меня возникли проблемы с выяснением, как это будет работать.

2. @Steve — да, и это связано со всем «пока я заканчиваю проверку»; p Действительно, похоже, что сделать XmlProtoSerializer общедоступным (с конструктором, использующим type-model) является наиболее прагматичным вариантом. Я очень хочу радоваться тому, что история с WCF хороша, вот почему в первом выпуске бета-версии официально не анонсированы перехваты WCF. Вероятно, я смогу включить материал XmlProtoSerializer в следующий drop

3. @Marc, хаха, я не совсем понял, что ты имел в виду под хуками. извините. Если бы я мог сделать один небольшой запрос функции, было бы неплохо иметь возможность включить сохранение ссылок на объекты в конструкторе, это была очень неудобная функция, которую было невозможно отследить в документации WCF. Из любопытства, дорого ли включать эту функцию по умолчанию? Спасибо за всю помощь, я действительно ценю это.

4. @Steve основная проблема заключается в том, что это отнимает у меня долгий путь от чего-либо даже отдаленно переносимого между платформами. Для несвязанной проблемы я пытался добавить «этот тип всегда следует рассматривать как ссылку» — этого будет достаточно?

5. @Marc — да, это сработало бы. Я предложил это только потому, что мне потребовалось больше дня, чтобы отследить ошибку в моем datacontract. У меня была общая древовидная структура, где каждый узел имеет ссылку на родительский узел, который не был сериализован WCF. Хуже всего было то, что трассировка WCF была особенно бесполезной. Наконец, я получил ошибку канала, которая содержала конкретное сообщение об ошибке десериализации ссылок. Учитывая, насколько сложно отследить ошибку, я бы подумал, что MS установила бы ее по умолчанию, если бы это не было действительно дорого. Я полагаю, что у MS также есть атрибут «тип как ссылка»