Насколько быстрым или легким является протокол буфера? - PullRequest
34 голосов
/ 24 января 2009

Протокольный буфер для .NET будет легче / быстрее, чем Remoting (SerializationFormat.Binary)? Будет ли первоклассная поддержка для него в терминах языка / структуры? то есть он обрабатывается прозрачно, как в Remoting / WebServices?

Ответы [ 2 ]

37 голосов
/ 24 января 2009

Некоторые показатели производительности и размера указаны на этой странице . В данный момент у меня нет статистики Джона, просто потому что страница немного устарела (Джон: мы должны это исправить!).

Ре быть прозрачным; protobuf-net может подключиться к WCF через контракт; обратите внимание, что он хорошо работает с MTOM, а не с Basic-http. Это не работает с Silverlight, так как Silverlight не хватает точки впрыска. Если вы используете svcutil, вам также нужно добавить атрибут в класс (через частичный класс).

Re BinaryFormatter (удаленное взаимодействие); да, это имеет полную поддержку; Вы можете сделать это просто с помощью тривиальной реализации ISerializable (т.е. просто вызовите метод Serializer с теми же аргументами). Если вы используете protogen для создания ваших классов, то он может сделать это за вас: вы можете включить это в командной строке с помощью аргументов (по умолчанию это не включено, поскольку BinaryFormatter не работает на всех платформах [CF] и т. д.)).

Обратите внимание, что для очень маленьких объектов (единичных экземпляров и т. Д.) При локальном удаленном взаимодействии (IPC) производительность BinaryFormatter на самом деле лучше, но для нетривиальных графов или удаленных ссылок (удаленное взаимодействие по сети) protobuf-net может выйти -производите это очень хорошо.

Следует также отметить, что формат проводов буферов протокола напрямую не поддерживает наследование; Protobuf-net может подделать это (сохраняя совместимость проводов), но, как и в случае с XmlSerializer, вам необходимо объявить подклассы заранее.


Почему есть две версии?

Радости открытого исходного кода, я думаю ;-p Джон и я работали над совместными проектами и обсуждали слияние этих двух, но дело в том, что они нацелены на два разных сценария:

  • dotnet-protobufs (Jon's) - это порт существующей версии Java. Это означает, что у него есть очень знакомый API для тех, кто уже использует java-версию, и он построен на типичных Java-конструкциях (классах компоновщика, неизменных классах данных и т. Д.) - с небольшими изменениями в C #.
  • protobuf-net (Марк) - это повторная реализация, основанная на том же двоичном формате (действительно, критическое требование заключается в том, что вы можете обмениваться данными между различными форматами), но с использованием типичного .NET идиомы:
    • изменяемые классы данных (без компоновщиков)
    • спецификация члена сериализации выражается в атрибутах (сравнимых с XmlSerializer, DataContractSerializer и т. Д.)

Если вы работаете на клиентах java и .NET, Jon's, вероятно, является хорошим выбором для знакомого API с обеих сторон. Если вы чистый .NET, у protobuf-net есть свои преимущества - знакомый API в стиле .NET, но также:

  • вы не вынуждены быть первым по контракту (хотя вы можете, и генератор кода поставляется)
  • вы можете повторно использовать существующие объекты (на самом деле классы [DataContract] и [XmlType] часто могут использоваться без каких-либо изменений)
  • он имеет полную поддержку наследования (которое достигается на проводе путем подмены инкапсуляции) (возможно, уникальное для реализации буферов протокола? Обратите внимание, что подклассы должны быть объявлены заранее)
  • он старается изо всех сил подключать и использовать основные инструменты .NET (BinaryFormatter, XmlSerializer, WCF, DataContractSerializer) - позволяя ему работать непосредственно как удаленный механизм. Предположительно, это будет довольно большой отрыв от основного ствола Java для порта Джона.

Повторное слияние их; Я думаю, что мы оба были бы открыты для этого, но маловероятно, что вы захотите оба набора функций, поскольку они нацелены на такие разные требования.

37 голосов
/ 24 января 2009

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

Мой собственный порт кода Java является явным - вы должны вызывать методы для сериализации / десериализации. (Существуют заглушки RPC, которые автоматически сериализуют / десериализуют, но пока нет реализации RPC.)

Проект Марка Гравелла очень хорошо вписывается в WCF, хотя - насколько я знаю, вам просто нужно сказать (один раз) использовать буферы протокола для сериализации, а все остальное прозрачно.

С точки зрения скорости вы должны взглянуть на страницу оценки Марка Гравелла . Мой код имеет тенденцию быть немного быстрее, чем его, но оба намного, намного быстрее, чем другие варианты сериализации / десериализации в платформе. Следует отметить, что буферы протокола также намного более ограничены - они не пытаются сериализовать произвольные типы, только поддерживаемые. В будущем мы попытаемся поддерживать более распространенные типы данных (десятичные, DateTime и т. Д.) Портативным способом (в качестве собственных сообщений буфера протокола).

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