如何在运行时编译协议缓冲模式?

时间:2015-02-07 11:38:13

标签: java protocol-buffers java-compiler-api

我可以使用Descriptors.Descriptor在运行时动态创建架构(FileDescriptorProto),我也可以使用DynamicMessage序列化和反序列化消息。

然而,由于构造消息的方式,DynamicMessage的性能不够好。我想知道是否可以在运行时编译模式并在反序列化消息时使用它以获得更好的性能。

如果协议缓冲区没有提供在运行时编译模式的方法,那么如果可以将Descriptors.Descriptor转换为临时.proto文件,那么我可以尝试通过调用{{1}来生成类从我的程序命令并使用Class.forName API将它们加载到程序中。

1 个答案:

答案 0 :(得分:3)

协议缓冲区不包含任何类型的内置" JIT"编译。

如果你想在运行时使用javac生成代码并编译它,并且你从FileDescriptorProto开始,那么你可能想要做的就是直接调用Java代码生成器(不将原型定义转换为文本)。

您可以通过编写一个创建google::protobuf::compiler::java::JavaGenerator的小C ++程序并将其传递到google::protobuf::compiler::PluginMain()来实现此目的。您现在有一个程序从标准输入读取CodeGeneratorRequest并将CodeGeneratorResponse写入标准输出。因此,您可以执行此程序直接从FileDescirptorProto生成Java代码。您可以将此代码传递给Java编译器。这应该比尝试生成要传递给protoc的文本更容易和更清晰。