Повысить сериализацию против буферов протокола google?

Есть ли у кого-нибудь, кто имеет опыт работы с этими библиотеками, какой-либо комментарий, какой из них он предпочитает? Были ли какие-либо различия в производительности или трудности с использованием?

Ответ 1

Я немного поиграл в обеих системах, ничего серьезного, просто некоторые хакерские вещи, но я чувствовал, что есть реальная разница в том, как вы должны использовать библиотеки.

С boost:: serialization вы сначала пишете свои собственные структуры/классы, а затем добавляете методы архивирования, но у вас все еще остаются некоторые довольно "тонкие" классы, которые могут использоваться как члены данных, унаследованные, независимо от того,.

С буферами протоколов объем кода, сгенерированного для даже простой структуры, довольно значителен, а создаваемые структуры и код больше предназначены для работы и что вы используете функциональные возможности буферов протокола для переноса данных на ваш собственные внутренние структуры.

Ответ 2

Я использую Boost Serialization в течение длительного времени и просто врывался в буферы протокола, и я думаю, что они не имеют такой же цели. BS (не видел этого) сохраняет ваши объекты С++ в поток, тогда как PB - это формат обмена, который вы читаете в/из.

PB datamodel проще: вы получаете все типы int и float, строки, массивы, базовую структуру и многое другое. BS позволяет вам сразу сохранить все ваши объекты за один шаг.

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

Итак, что для вас важнее: эффективность скорости/пространства или чистый код?

Ответ 3

Есть несколько дополнительных проблем с boost.serialization, которые я добавлю в микс. Предостережение: у меня нет прямого опыта работы с буферами протоколов, которые не позволяют просматривать документы.

Обратите внимание, что, хотя я думаю, что boost, и boost.serialization, отлично подходит к тому, что он делает, я пришел к выводу, что форматы архива по умолчанию, с которыми он поставляется, не являются отличным выбором для формата проводов.

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

Новые версии boost.serialization не могут генерировать архивы, которые более старые версии могут десериализовать. (обратное не верно: более новые версии всегда предназначены для десериализации архивов, сделанных более старыми версиями). Это привело к следующим проблемам для нас:

  • Как наше клиентское, так и серверное программное обеспечение создает сериализованные объекты, которые другие потребляют, поэтому мы можем перейти только к новой версии boost.serialization, если мы обновим клиент и сервер в режиме блокировки. (Это довольно сложная задача в среде, где у вас нет полного контроля над вашими клиентами).
  • Boost поставляется в виде одной большой библиотеки с разделяемыми частями, и как код сериализации, так и другие части библиотеки boost (например, shared_ptr) могут использоваться в одном файле, я не могу обновить некоторые части boost, потому что Я не могу обновить boost.serialization. Я не уверен, возможно ли /safe/sane попытаться связать несколько версий boost в один исполняемый файл, или если у нас есть бюджет/энергия, чтобы реорганизовать биты, которые должны оставаться на более старой версии boost в отдельную исполняемый файл (DLL в нашем случае).
  • Старая версия boost, на которую мы застряли, не поддерживает последнюю версию используемого компилятора, поэтому мы тоже застряли в старой версии компилятора.

Google, похоже, фактически опубликовать формат протоколов буферов протоколов, а Википедия описывает их как совместим с forwards, совместим с обратной стороной (хотя, я думаю, Wikipedia ссылается на управление версиями данных, а не на управление версиями библиотеки протоколов). Хотя ни одна из них не является гарантией передовой совместимости, мне кажется более сильным признаком.

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

Сноска: бесстыдный плагин для связанного ответа от меня.

Ответ 4

Повысить сериализацию

  • - это библиотека для записи данных в поток.
  • не сжимает данные.
  • не поддерживает автоматическое управление версиями данных.
  • поддерживает контейнеры STL.
  • свойства записанных данных зависят от выбранных потоков (например, endian, compress).

Буферы протоколов

  • генерирует код из описания интерфейса (поддерживает С++, Python и Java по умолчанию C, С# и другие сторонними). ​​
  • необязательно сжимает данные.
  • автоматически выполняет управление версиями данных.
  • обрабатывает согласование между платформами.
  • не поддерживает контейнеры STL.

Расширение сериализации - это библиотека для преобразования объекта в сериализованный поток данных. Буферы протоколов делают то же самое, но также выполняют другую работу для вас (например, управление версиями и сводная запись по endian). Ускорение сериализации проще для "небольших простых задач". Вероятно, протокольные буферы лучше для "более крупной инфраструктуры".

EDIT: 24-11-10: добавлено "автоматически" для версии BS.

Ответ 5

У меня нет опыта работы с последовательной сериализацией, но я использовал буферы протокола. Мне очень нравятся протокольные буферы. Имейте в виду следующее (я говорю это без знания повышения).

  • Буферы с протоколами очень эффективны, поэтому я не думаю, что это серьезная проблема против повышения.
  • Буферы протокола предоставляют промежуточное представление, которое работает с другими языками (Python и Java... и многое другое в работе). Если вы знаете, что используете только С++, возможно, лучше, но лучше использовать другие языки.
  • Буферы протоколов больше похожи на контейнеры данных... нет объектно-ориентированного характера, такого как наследование. Подумайте о структуре того, что вы хотите сериализовать.
  • Буферы протоколов являются гибкими, поскольку вы можете добавить "необязательные" поля. Это в основном означает, что вы можете изменить структуру буфера протокола, не нарушая совместимость.

Надеюсь, что это поможет.

Ответ 6

boost.serialization просто нуждается в компиляторе С++ и дает вам синтаксический сахар, например

serialize_obj >> archive;
// ...
unserialize_obj << archive;

для сохранения и загрузки. Если С++ - единственный язык, который вы используете, вы должны дать boost.serialization серьезный снимок.

Я быстро посмотрел на буферы протокола google. Из того, что я вижу, я бы сказал, что он не напрямую сопоставим с boost.serialization. Вы должны добавить компилятор для .proto файлов в свою инструментальную цепочку и сохранить сами файлы .proto. API не интегрируется в С++ как boost.serialization.

boost.serialization делает работу, разработанную для очень хорошо: сериализовать объекты С++:) OTOH API-интерфейс запроса, такой как буферы протокола google, дает вам большую гибкость.

Поскольку я использовал только boost.serialization, пока не могу комментировать сравнение производительности.

Ответ 7

Исправление выше (предположим, что это этот ответ) о Boost Serialization:

Это разрешает поддерживать управление версиями данных.

Если вам требуется сжатие - используйте сжатый поток.

Может обрабатывать конечную замену между платформами, поскольку кодирование может быть текстовым, двоичным или XML.

Ответ 8

Я никогда ничего не реализовал с помощью библиотеки boost, но я обнаружил, что Google protobuff более продуман, и код намного чище и легче читать. Я бы посоветовал взглянуть на различные языки, с которыми вы хотите их использовать, и прочитать код и документацию и придумать.

Одна сложность, с которой я столкнулся с protobufs, была названа очень часто используемой функцией в их сгенерированном коде GetMessage(), который, конечно, конфликтует с макросом Win32 GetMessage.

Я по-прежнему очень рекомендую протобуфы. Они очень полезны.

Ответ 9

Как и почти все в технике, мой ответ... "это зависит".

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

Для меня это действительно сводится к рабочему процессу и нужно ли вам что-то другое, кроме С++, на другом конце.

Если вы хотите сначала выяснить содержимое своего сообщения и создать систему с нуля, используйте протокольные буферы. Вы можете думать об этом абстрактным образом, а затем автоматически генерировать код на любом языке, который вы хотите (сторонние плагины доступны практически для всего). Кроме того, я обнаружил, что упрощенное взаимодействие с протокольными буферами. Я просто передаю файл .proto, а затем у другой команды есть четкое представление о том, какие данные передаются. Я также ничего не навязываю им. Если они хотят использовать Java, продолжайте!

Если я уже построил класс на С++ (и это произошло чаще всего), и я хочу отправить эти данные по этому каналу, то, например, Boost Serialization делает тонну смысла (особенно, когда у меня уже есть Boost зависимость где-то еще).

Ответ 10

Вы можете использовать форсированную сериализацию в тесной связи с вашими "реальными" объектами домена и сериализовать полную иерархию объектов (наследование). Protobuf не поддерживает наследование, поэтому вам придется использовать агрегацию. Люди утверждают, что Protobuf следует использовать для DTO (объекты передачи данных), а не для объектов основного домена. Я использовал как boost:: serialization, так и protobuf. Должна быть принята во внимание производительность boost:: serialization, cereal может быть альтернативой.