Может ли буфер протокола анализировать сообщение в формате «строка отладки»? - PullRequest
7 голосов
/ 14 августа 2011

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

Есть ли способ анализа читаемого человеком формата? (строка отладки, предоставленная самим protobuf или другим форматом).

Ответы [ 4 ]

5 голосов
/ 14 августа 2011

Существует также текстовый формат, но поддержка этого зависит от конкретной реализации. Например, я не поддерживаю вообще в protobuf-net. Но да: такое определяется и обсуждается (например) здесь: http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.text_format.html

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

4 голосов
/ 16 августа 2011

Если вы не возражаете против использования инструментов командной строки, проект Piqi включает в себя команду piqi convert для преобразования между 4 форматами: двоичные буферные протоколы, JSON, XML и * 1005.* Piq .Формат Piq специально разработан для просмотра и редактирования данных в текстовом редакторе.

1 голос
/ 17 октября 2017

Вопрос не указывает язык программирования, и мой ответ только о Java.

В Java метод Message экземпляра toString возвращает читаемый человеком текстовый формат. Затем тот же формат может быть проанализирован в Message экземпляре с помощью TextFormat.merge:

String messageString = ...
MyMessage.Builder builder = MyMessage.newBuilder();
TextFormat.merge(messageString, builder);
MyMessage newMessage = builder.build();

( Вариации метода merge также можно читать из потока, чтобы избежать чтения всей строки сообщения в память.)

0 голосов
/ 14 августа 2011

Вы уверены, что хотите использовать ProtoBuf? Сначала вы можете использовать Json, а затем переключиться на Bson или MessagePack в двоичном формате.

Комбинация Json / Bson имеет то преимущество, что вы можете использовать для них одну и ту же библиотеку (Json.net). Я считаю, что Bson немного больше, чем ProtoBuf. * ​​1003 *

Или вы можете использовать Json / MessagePack. Технически MessagePack является лучшим двоичным форматом, чем Bson / ProtoBuf IMO. Но поддержка инструментов хуже, и вам понадобится отдельная библиотека для Json и MessagePack. Он поддерживает все, что делает Json и даже больше (в частности, он может использовать как строковые, так и целочисленные ключи в словарях).

Быстрое сравнение MsgPack и ProtoBuf:

  • Результирующий размер данных при использовании аналогичных конструкций представляется сопоставимым.
  • Производительность кодирования / декодирования во многом зависит от реализации, но я ожидаю, что она будет примерно такой же величины
  • MsgPack более самоописан. , В ProtoBuf вы даже не видите, является ли что-то под-сообщением или каплей.
  • MsgPack поддерживает нецелочисленные ключи в словаре. Это позволяет сохранять свойства по именам, когда вам не важен размер, и переключаться на целые числа, где выигрыш велик.
  • MsgPack хранит количество элементов вместо размера для массивов / словарей. Преимущество этого заключается в том, что вам не нужно постоянно возвращаться к выходным данным и подгонять их по размеру, что облегчает написание сериализатора и, возможно, обеспечивает более высокую скорость записи. С другой стороны, вы не можете легко пропустить элемент, потому что вы не знаете его размера.
  • MsgPack естественным образом поддерживает расширенный набор Json, поэтому вы можете легко перейти с Json.
  • Поддержка инструментов, документация и популярность намного лучше с ProtoBuf. В частности, ProtoBuf.net выглядит лучше, чем код C #, доступный для MsgPack.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...