如何在运行时编译协议缓冲区架构?

Boy*_*ame 3 java protocol-buffers java-compiler-api

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

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

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

Ken*_*rda 5

Protocol Buffers 不包括任何类型的内置“JIT”编译。

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

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