Я должен был недавно искать портирование C# библиотеки Protocol Buffers, первоначально разработанной Google. И угадайте то, что, я нашел два проекта принадлежавшими оба двум очень хорошо известным людям здесь: protobuf-csharp-port, записанный Jon Skeet и protobuf-сетью, записанной Marc Gravell. Мой вопрос прост: какой я должен выбрать?
Мне вполне нравится решение Marc, поскольку это кажется мне ближе к C# philisophy (например, можно просто добавить атрибуты к свойствам существующего класса), и похоже, что это может поддерживать.NET встроенные типы, такие как Система. Гуид.
Я уверен, что они оба - действительно замечательные проекты, но каково Ваше мнение?
Я согласен с точкой зрения Джона; если вы пишете код в нескольких средах, то его версия предоставляет вам API, аналогичный другим «основным» реализациям. protobuf-net намного больше похож на то, как реализовано большинство сериализаторов .NET, поэтому он более знаком (IMO) разработчикам .NET. И, как отмечает Джон, исходный двоичный вывод должен быть идентичным, чтобы вы могли повторно реализовать его с другим API, если вам это понадобится позже.
Некоторые моменты, касающиеся protobuf-net, специфичных для этой реализации:
ISerializable
для существующих типов ] ShouldSerialize [name]
XmlType
/ XmlElement
или DataContract
/ DataMember
) - значение (для пример), что модели LINQ-to-SQL сериализуются "из коробки" (пока сериализация включена в DBML) (* = эти функции используют 100% действительный двоичный файл protobuf, но его трудно использовать на других языках)
Используете ли вы в своем проекте и другие языки? Если это так, мой порт C # позволит вам писать аналогичный код на всех платформах. Если нет, то для начала порт Марка, вероятно, более идиоматичен для C #. (Я пытался заставить свой код «ощущаться» как обычный C #, но дизайн явно основан на Java-коде, намеренно так, чтобы он был знаком и тем, кто использует Java.)
Конечно, один из прелесть этого в том, что вы можете позже передумать и быть уверены, что все ваши данные будут по-прежнему действительны через другой проект - они должны быть абсолютно двоичными (с точки зрения сериализованных данных), насколько мне известно.
Я только что переключился с protobuf-csharp-port на protobuf-net, потому что: