Как десериализовать protobufs без файла Proto? - PullRequest
0 голосов
/ 31 октября 2018

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

Я считал:

  • Обратный инжиниринг двоичного формата
    • Генерация большого количества буферов и их анализ
    • возможно с отладчик и сторонние классы
    • Обратная компиляция классов Java для получения некоторого (некрасивого) исходного кода (но рефакторинг автоматически сгенерированного кода кажется плохой идеей).
  • Генерация .proto файлов из файлов классов (не уверен, если это возможно)
  • Общее чтение protobufs без файла .proto и без автоматически сгенерированного кода, но я не уверен, что в буферах достаточно встроенных метаданных, чтобы это было возможно.

Как это можно сделать?

1 Ответ

0 голосов
/ 03 ноября 2018

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

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

your_proto_message.getDescriptorForType()

или используя

ProtoMessageClass.getDescriptor()

Если представление файла .proto - это все, что вам нужно, вы можете просто вызвать .toProto() в дескрипторе. Подробнее здесь .

Итак, подведем итог:

ProtoMessageClass.getDescriptor().toProto().toString()

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