Должен ли я использовать двоичный или текстовый файл для хранения сообщений protobuf? - PullRequest
2 голосов
/ 07 декабря 2009

Используя Google protobuf, я сохраняю свои сериализованные сообщения в файл - в каждом файле есть несколько сообщений. У нас есть версии кода на C ++ и Python, поэтому мне нужно использовать функции protobuf, которые доступны на обоих языках. Я экспериментировал с использованием SerializeToArray и SerializeAsString, и, кажется, есть следующие неудачные условия:

  1. SerializeToArray: как предлагается в одном ответе, лучший способ использовать это, чтобы префикс каждого сообщения с его размером данных. Это отлично подойдет для C ++, но в Python это не выглядит возможным - я не прав?

  2. SerializeAsString: генерирует сериализованную строку, эквивалентную ее двоичному аналогу - которую я могу сохранить в файл, но что произойдет, если один из символов в результате сериализации будет \ n - как нам найти окончания строк, или окончание сообщений по этому вопросу?

Обновление:

Пожалуйста, позвольте мне немного перефразировать. Насколько я понимаю, я не могу записывать двоичные данные в C ++, потому что тогда наше приложение Python не может читать данные, поскольку оно может только анализировать строковые сериализованные сообщения. Должен ли я вместо этого использовать SerializeAsString в C ++ и Python? Если да, то лучше ли хранить такие данные в текстовом файле, а не в двоичном файле? У меня двоичное чувство, но, как вы видите, это не похоже на вариант.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2009

Лучшая практика для объединения сообщений таким способом - добавлять каждое сообщение к его размеру. Таким образом, вы читаете в размере (попробуйте 32-битное int или что-то), затем считываете это количество байтов в буфер и десериализуете его. Затем прочитайте следующий размер и т. Д. И т. Д.

То же самое касается записи: сначала вы записываете размер сообщения, а затем само сообщение.

См. Потоковая передача нескольких сообщений в документации к protobuf для получения дополнительной информации.

4 голосов
/ 20 апреля 2010

Мы добились большого успеха в base64-кодировании сообщений и использовании простого \ n для разделения сообщений. Это, конечно, во многом зависит от вашего использования - нам нужно хранить сообщения в лог-файлах. Это естественно имеет накладные расходы на кодирование / декодирование, но это даже не было проблемой для нас.

Преимущество сохранения этих сообщений в виде текста, разделенного строками, до сих пор было неоценимым для обслуживания и отладки. Выясните, сколько сообщений в файле? wc -l. Найдите N-е сообщение - head ... | tail. Выясните, что не так с записью в удаленной системе, к которой вам нужно получить доступ через 2 VPN и решение Citrix? скопируйте, вставьте сообщение и отправьте его по почте программисту.

0 голосов
/ 20 декабря 2011

Protobuf - это двоичный формат, поэтому чтение и запись должны выполняться в двоичном, а не текстовом формате. Если вам не нужен двоичный формат, вам следует рассмотреть возможность использования чего-то другого, кроме protobuf (существует множество текстовых форматов данных, таких как XML, JSON, CSV); недостаточно просто использовать текстовые абстракции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...