我可以使用Descriptors.Descriptor
在运行时动态创建架构(FileDescriptorProto
),我也可以使用DynamicMessage序列化和反序列化消息。
然而,由于构造消息的方式,DynamicMessage
的性能不够好。我想知道是否可以在运行时编译模式并在反序列化消息时使用它以获得更好的性能。
如果协议缓冲区没有提供在运行时编译模式的方法,那么如果可以将Descriptors.Descriptor
转换为临时.proto文件,那么我可以尝试通过调用{{1}来生成类从我的程序命令并使用Class.forName API将它们加载到程序中。
答案 0 :(得分:3)
协议缓冲区不包含任何类型的内置" JIT"编译。
如果你想在运行时使用javac生成代码并编译它,并且你从FileDescriptorProto
开始,那么你可能想要做的就是直接调用Java代码生成器(不将原型定义转换为文本)。
您可以通过编写一个创建google::protobuf::compiler::java::JavaGenerator
的小C ++程序并将其传递到google::protobuf::compiler::PluginMain()
来实现此目的。您现在有一个程序从标准输入读取CodeGeneratorRequest
并将CodeGeneratorResponse
写入标准输出。因此,您可以执行此程序直接从FileDescirptorProto
生成Java代码。您可以将此代码传递给Java编译器。这应该比尝试生成要传递给protoc
的文本更容易和更清晰。