Должен ли я использовать двоичный или текстовый файл для хранения сообщений protobuf?

StackOverflow https://stackoverflow.com/questions/1859267

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

Обновить:

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top