Как выбрать между protobuf-CSharp-port и protobuf-net


недавно мне пришлось искать портирование C# библиотеки буферов протокола, первоначально разработанной Google. И угадайте, что я нашел два проекта, принадлежащие двум очень известным людям здесь: protobuf-csharp-port, написано Джон Скит и protobuf-net, написано Марк Gravell. Мой вопрос прост: какой из них я должен выбрать ?

Мне очень нравится решение Марка, как мне кажется, ближе к C# philisophy (например, вы можете просто добавить атрибуты к свойствам существующего класса), и похоже, что он может поддерживать встроенные типы .NET, такие как System.идентификатор GUID.

Я уверен, что оба они действительно большие проекты, но каков ваш oppinion?

5 58

5 ответов:

Я согласен с точками Джона; если вы кодируете в нескольких средах, то его версия дает вам аналогичный API для других "основных" реализаций. protobuf-net гораздо больше похож на то, как реализованы большинство сериализаторов .NET, поэтому он более знаком (IMO) с разработчиками .NET. И как отмечает Джон-необработанный двоичный вывод должны быть идентичными, так что вы можете повторно реализовать с другим API, если вам нужно позже.

некоторые точки re protobuf-net, которые являются конкретные реализация:

  • работает с существующей типы (не только сгенерированные типы .прото)
  • работает под такими вещами, как WCF и memcached
  • может использоваться для реализации ISerializable для существующих типов
  • поддерживает наследование * и методы обратного вызова сериализации
  • поддерживает общие шаблоны, такие как ShouldSerialize[name]
  • работает с существующими оформлены видах (XmlType/XmlElement или DataContract/DataMember) - это означает (например), что модели LINQ-to-SQL сериализуются из коробки (если сериализация включена в DBML)
  • в v2, работает для типов POCO без каких-либо атрибутов
  • в v2 работает в .NET 1.1 (не уверен, что это огромная функция продажи) и большинство других фреймворков (включая monotouch - yay!)
  • возможно (еще не реализовано) v2 может поддерживать полный граф* сериализация (не только дерево сериализация)

(*=эти функции используют 100% допустимый двоичный файл protobuf, но который может быть трудно использовать с других языков)

вы также используете другие языки в своем проекте? Если это так, мой порт C# позволит вам писать подобный код на всех платформах. Если нет, то порт Марка, вероятно, более идиоматичен C# для начала. (Я попытался сделать свой код" похожим " на обычный C#, но дизайн явно основан на Java-коде, чтобы он был знаком и тем, кто использует Java.)

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

в соответствии с этим сайт проекта GitHub protobuf-csharp-port Теперь был свернут в основной проект буферов протокола Google, так что это будет официальная реализация .NET protobuf 3. однако protobuf-net был последнее обновление в 2013 году, хотя несколько коммитов в последнее время на GitHub.

Я только что переключился с protobuf-CSharp-port на protobuf-net, потому что:

  • protobuf-net больше похож на .net, т. е. дескрипторы для сериализации членов вместо генерации кода.
  • Если вы хотите скомпилировать protobuf-CSharp-port .proto файлы, которые вы должны сделать 2-х шаговый процесс, т. е. компилировать с протоколом к.протобин, а затем скомпилировать его с протогеном. protobuf-net делает это в один шаг.

в моем случае я хочу использовать буферы протокола для замены модели связи на основе xml между клиентом .net и серверной частью j2ee. Поскольку я уже использую генерацию кода, я пойду на реализацию Джона.

для проектов, не требующих Java-взаимодействия, я бы выбрал реализацию Marc, тем более что v2 позволяет работать без аннотаций.