Я могу создать схему (Descriptors.Descriptor
) во время выполнения динамически, используя FileDescriptorProto
, также я могу сериализовать и десериализовать сообщения с помощью DynamicMessage.Как скомпилировать схему буферов протокола во время выполнения?
Однако производительность DynamicMessage
не достаточно хороша из-за того, как она создает сообщения. Интересно, можно ли компилировать схему во время выполнения и использовать ее при де-сериализации сообщений для повышения производительности.
Если протокол буфера не обеспечивают способ компилировать схемы во время выполнения, то, если это возможно, чтобы преобразовать Descriptors.Descriptor
временный файл .proto, то я могу попытаться создать классы, вызвав protoc
команды из моей программы и загрузок их в программу, используя API Class.forName.
К сожалению, у меня недостаточно опыта работы с C++, поэтому я считаю, что мне будет сложно поддерживать и распространять этот плагин в узлах кластера. Компилятор javac фактически не компилирует код «на лету», поэтому, даже если я прочитал исходный код непосредственно со стандартного ввода, мне все равно нужно записать его в файл, чтобы использовать javac. Я подумал, может быть, protobuf может обеспечить способ сериализации FileDescriptorProto обратно в .proto, поскольку он уже использует это определение для создания FileDescriptorProto, но если это не так, я пойду своим путем. – Boyolame
FWIW, необходимый код на C++ содержит около четырех строк для всей программы - это просто создание «JavaGenerator» и передача его в «PluginMain». ;; Я несколько смущен вашим возражением против 'javac' - даже если вы преобразовали FileDescriptorProto обратно в текст и затем загрузили его в' protoc', выход по-прежнему является кодом Java, поэтому вам все равно нужно 'javac' или что-то вроде Это. –
Я предположил, что вы предложили мне написать небольшой плагин, это проблема переносимости, потому что программа позволит мне напрямую записывать/читать данные в программу без использования файловой системы. Однако, хотя я прочитал исходный код java из этой программы, мне все равно нужно записать его в файловую систему, чтобы запустить javac-компилятор, поэтому единственное преимущество этого плагина для меня - преобразование экземпляра FileDescriptorProto в определение protoc больше не требуется. Кроме того, protoc легко устанавливается через менеджеров пакетов в Linux, но если я пишу плагин, я также должен сам его распространять на узлы. – Boyolame