Как скомпилировать схему буферов протокола во время выполнения?

Я могу создать схему (Descriptors.Descriptor) во время выполнения динамически используя FileDescriptorProtoТакже я могу сериализовать и десериализовать сообщения, используя DynamicMessage.

Однако производительность DynamicMessage недостаточно хорош из-за того, как он создает сообщения. Интересно, возможно ли скомпилировать схему во время выполнения и использовать ее при десериализации сообщений для повышения производительности.

Если буферы протокола не позволяют компилировать схемы во время выполнения, то возможно ли преобразовать Descriptors.Descriptor во временный файл.proto, то я могу попытаться сгенерировать классы, вызвав protoc Команда из моей программы и загрузить их в программу, используя Class.forName API.

1 ответ

Решение

Протокол Buffers не включает в себя встроенную компиляцию "JIT".

Если вы хотите сгенерировать код и скомпилировать его с Java c во время выполнения, и вы начинаете с FileDescriptorProto, тогда, вероятно, вы хотели бы вызвать генератор кода Java напрямую (без преобразования прототипа в текст).

Вы можете сделать это, написав небольшую программу на C++, которая создает google::protobuf::compiler::java::JavaGenerator и передает его в google::protobuf::compiler::PluginMain(), Теперь у вас есть программа, которая читает CodeGeneratorRequest из стандартного ввода и пишет CodeGeneratorResponse на стандартный вывод. Таким образом, вы можете выполнить эту программу для генерации Java-кода непосредственно из FileDescirptorProto s. Вы должны передать этот код компилятору Java. Это должно быть намного проще и чище, чем пытаться создать текст для передачи protoc,

Другие вопросы по тегам