2010-03-26 2 views
57

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

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

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

+3

Protobuf-csharp-port конечно. Джон получил больше репутации!^_^ –

+1

Битва гигантов! – Farax

+0

Как насчет производительности? (так как это основной пункт protobuf) Есть ли один быстрее, чем другой? – tigrou

ответ

52

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

некоторых точек повторно Protobuf-сеть, которые являются конкретные для этой реализации:

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

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

35

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

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

+0

Наш проект не заполнен C#, и я заметил, что ваш проект действительно был более «кросс-языками» ... – PierrOz

+2

@PierrOz: В этом случае вы вполне можете использовать Marc's. В частности, если вам не требуется определение .proto для чего-либо еще, решение Marc проще. –

+0

@JonSkeet Поддерживает ли protobuf-csharp-port winrt (win8.1 и wp8.1)? Просто столкнитесь с некоторыми проблемами здесь http://stackoverflow.com/questions/24670524/does-protobuf-csharp-port-support-windows-rt – IloveIniesta

6

Я только что перешел с Protobuf-Csharp-порта Protobuf-сеть, потому что:

  • Protobuf-сеть является более «.net как», то есть дескрипторы сериализация членов вместо генерации кода ,
  • Если вы хотите скомпилировать файлы protobuf-csharp-port .proto, вам нужно сделать двухэтапный процесс, то есть скомпилировать с protoc в .protobin, а затем скомпилировать это с помощью protoGen. protobuf-net делает это за один шаг.
3

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

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

Смежные вопросы