我可以在运行时使用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
写入标准输出。因此,您可以执行此程序,直接从FileDescirptorProto
s生成Java代码。这取决于您将此代码传递给Java编译器。这应该比尝试生成要传递给protoc
的文本更容易、更干净。