Можно ли извлечь все номера тегов из данной сериализации protobuf? - PullRequest
2 голосов
/ 06 февраля 2012

Учитывая сериализацию protobuf, возможно ли получить список всех номеров тегов в сообщении?Можно ли вообще просматривать структуру сообщения без определения файлов .proto?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

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

Если вы посмотрите на проводное кодирование , вы увидите, что (например) байтовые массивы, строки и вложенные сообщения кодируются одинаково - поэтому вы можете знать, что «поле 3 - это длина двоичное поле с префиксом ", но вы не будете знать, означает ли это, что это вложенное сообщение, строка или байтовый массив.

2 голосов
/ 06 февраля 2012

Большинство API действительно имеют некоторую форму API для чтения, которая позволяет вам перечислять необработанный поток protobuf. Однако этого недостаточно для полного понимания данных, поскольку без схемы интерпретация неоднозначна:

  • переменная может быть закодирована зигзагообразно (sint32 / sint64) или нет (int32 / int64 / uint32 / uint64) - радикально изменить значение или логическое значение, или перечисление
  • fixed-32 / fixed-64 может быть целым числом со знаком или без знака или может быть числом с плавающей запятой IEEE754 / double
  • блок с префиксом длины может быть строкой UTF-8, BLOB, дополнительным сообщением или «упакованным» повторяющимся набором примитивов; если это под-сообщение, вам придется рекурсивно повторять

Так что ... да и нет. Конечно, вы можете получить номера полей самого внешнего сообщения.

Другой подход - использовать обычный API для типа с без членов (message Naked {}), а затем запрашивать неожиданные данные (то есть все) через API-интерфейс «extension», предоставляемый многими реализациями.

...