Как скомпилировать схему буферов протокола во время выполнения?
Я могу создать схему (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
,