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



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

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

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

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

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

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

最新更新