WCF рекомендует подходы для сериализации нескольких объектов - PullRequest
2 голосов
/ 12 февраля 2009

Я пытаюсь оптимизировать вокруг возможного узкого места.

У меня есть серверное приложение, которое обслуживает объекты из базы данных удаленно, которые могут работать с 1 - n объектами 1 - n разных типов (где n может быть относительно большим числом), которые все реализуют общий интерфейс, но может содержать много уникальных свойств для разных типов.

Клиентские приложения хранят объекты сервера в локальном кэше до тех пор, пока они не будут готовы сохранить их через сервер в базе данных.

В настоящее время это делается в WCF, где каждый класс определяет DataContract.

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

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

1 Ответ

3 голосов
/ 12 февраля 2009

Насколько высоко "относительно высоко"?

Например, один из возможных вариантов - использовать объект-оболочку:

[DataContract]
public class Wrapper {
    [DataMember(Order = 1)]
    public List<Foo> Foos {get {...}}

    [DataMember(Order = 2)]
    public List<Bar> Bars {get {...}}

    [DataMember(Order = 3)]
    public List<Blop> Blops {get {...}}
}

Тогда вы сможете отправить одно сообщение с любым количеством записей Foo, Bar и / или Blop. Мое включение атрибута Order было преднамеренным - если вы хотите уменьшить размер потока, вы можете рассмотреть protobuf-net - с указанным выше макетом protobuf-net может подключиться к WCF, просто включив [ProtoBehavior] для метода (в интерфейсе контракта операций), который вы хотите атаковать (как на клиенте, так и на сервере). Это переключает передачу на использование бинарного формата Google «Protocol Buffers», используя base-64 для кодирования. Если вы используете привязку basic-http, она также может использовать MTOM, если она включена, поэтому даже base-64 не представляет проблемы. Используя это, вы можете получить значительную экономию при передаче данных (~ 1/5 от расстояния, основанного на показанных числах).

(правка 1 - protobuf-net предполагает, что Foo, Bar и Blop также используют атрибут Order)

(правка 2 - обратите внимание, что вы всегда можете разбить запрос на несколько сообщений среднего размера Wrapper, а затем вызвать метод, чтобы применить все изменения, как только они появятся на сервере (предположительно в промежуточной таблице) в базе данных))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...