Какой метод наиболее эффективен при перемещении объектов через провод в .NET?

Я использую WebServices при перемещении данных по проводу, и это мне очень понравилось. Он выделяется при отправке небольших фрагментов данных. Как только вам придется перемещать массивы с большим количеством свойств, полученный XML-суп принимает 100 тыс. Данных и превращает их в 1 МБ.

Итак, я попробовал сжатие IIS, но это оставило меня недовольным. Он хорошо сжимал данные, но компромисс был в сжатии/декомпрессии. Затем я сериализовал объекты через BinaryFormatter и отправил их через. Это было лучше, однако скорость кодирования/декодирования все еще остается.

Во всяком случае, я слышал, что я застрял в 00-х, и теперь есть лучшие способы отправить данные по проводу, такие как ProtocolBuffers, MessagePack и т.д.

Может ли кто-нибудь сказать мне, будут ли эти новые протоколы лучше подходят для отправки больших фрагментов данных и не хватает ли мне некоторых других эффективных способов сделать это?

Эффективным я имею в виду объем полосы пропускания, скорость кодирования/декодирования, скорость выполнения и т.д.

Ответы

Ответ 1

Это зависит от того, что составляет основную часть ваших данных. Если вы только что получили много объектов с несколькими полями, и это действительно крут, который "расширяет" их, тогда другие форматы, такие как протокольные буферы, могут иметь огромное значение. Я не использовал MessagePack или Thrift, но я бы ожидал, что они могут получить одинаковый прирост по размеру.

Что касается скорости кодирования и декодирования, я считаю, что как реализация Gracell Marcell протоколов протоколов и мой собственный будет превосходить любую из встроенных схем сериализации.

Ответ 2

Это сильно зависит от того, где ваши приоритеты лежат, и какого типа клиента вы используете.

WCF предоставляет несколько отличных способов передачи данных по сети, включая многие параметры привязки, а также довольно эффективные сериализаторы, такие как DataContractSerializer. При этом многие из этих вещей требуют "богатого" клиента, который также использует WCF.

Если это не вариант, то что-то вроде буферов протоколов может быть очень хорошим подходом. Это обеспечивает очень быструю сериализацию/десериализацию, а также разумный размер передачи для большинства данных.

Ответ 4

Используя библиотеку Simon Hewitt (написанную на С#) для выполнения сериализации, она эффективна с точки зрения пропускной способности и скорости кодирования/декодирования. Библиотека распространяется как исходный код С#.

Единственная проблема заключается в том, чтобы избежать сериализации .NET для ввода данных - для структур данных, которые не поддерживаются библиотекой, явная кодировка должна выполняться в коде клиента, чтобы избежать вызова сериализации .NET. Это влияет на скорость реализации, но я получил улучшение в 2-3 раза по размеру и в 20-40 раз за время, затраченное на сериализацию.