Как выбрать между protobuf-csharp-port и protobuf-сетью

Я должен был недавно искать портирование C# библиотеки Protocol Buffers, первоначально разработанной Google. И угадайте то, что, я нашел два проекта принадлежавшими оба двум очень хорошо известным людям здесь: protobuf-csharp-port, записанный Jon Skeet и protobuf-сетью, записанной Marc Gravell. Мой вопрос прост: какой я должен выбрать?

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

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

64
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

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

Некоторые моменты, касающиеся protobuf-net, специфичных для этой реализации:

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

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

57
ответ дан 24 November 2019 в 15:53
поделиться

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

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

40
ответ дан 24 November 2019 в 15:53
поделиться

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

  • protobuf-net больше похож на .net, то есть дескрипторы для сериализации элементов вместо генерации кода.
  • Если вы хотите скомпилировать файлы protobuf-csharp-port .proto, вам необходимо выполнить двухэтапный процесс, то есть скомпилировать с помощью protoc в .protobin, а затем скомпилировать его с помощью protoGen. protobuf-net делает это за один шаг.
6
ответ дан 24 November 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: