如何在运行时编译协议缓冲区模式?
How to compile protocol buffers schema at runtime?
我可以在运行时使用 FileDescriptorProto
动态创建模式 (Descriptors.Descriptor
),我还可以使用 DynamicMessage 序列化和反序列化消息。
但是 DynamicMessage
的性能还不够好,因为它构建消息的方式。我想知道是否可以在运行时编译架构并在反序列化消息时使用它以获得更好的性能。
如果协议缓冲区不提供在运行时编译模式的方法,那么如果可以将 Descriptors.Descriptor
转换为临时 .proto 文件,那么我可以尝试生成 类通过从我的程序调用 protoc
命令并使用 Class.forName API.
将它们加载到程序中
Protocol Buffers 不包含任何类型的内置 "JIT" 编译。
如果您想生成代码并在运行时用 javac 编译它,并且您从 FileDescriptorProto
开始,那么您可能想要做的是调用 Java 代码直接生成器(不将原型定义转换为文本)。
您可以通过编写一个小的 C++ 程序来完成此操作,该程序创建一个 google::protobuf::compiler::java::JavaGenerator
and passes it into google::protobuf::compiler::PluginMain()
. You now have a program which reads a CodeGeneratorRequest
from standard input and writes a CodeGeneratorResponse
到标准输出。因此,您可以执行此程序以直接从 FileDescirptorProto
生成 Java 代码。将此代码传递给 Java 编译器取决于您。这应该比尝试生成要传递给 protoc
.
的文本更容易和更清晰
我可以在运行时使用 FileDescriptorProto
动态创建模式 (Descriptors.Descriptor
),我还可以使用 DynamicMessage 序列化和反序列化消息。
但是 DynamicMessage
的性能还不够好,因为它构建消息的方式。我想知道是否可以在运行时编译架构并在反序列化消息时使用它以获得更好的性能。
如果协议缓冲区不提供在运行时编译模式的方法,那么如果可以将 Descriptors.Descriptor
转换为临时 .proto 文件,那么我可以尝试生成 类通过从我的程序调用 protoc
命令并使用 Class.forName API.
Protocol Buffers 不包含任何类型的内置 "JIT" 编译。
如果您想生成代码并在运行时用 javac 编译它,并且您从 FileDescriptorProto
开始,那么您可能想要做的是调用 Java 代码直接生成器(不将原型定义转换为文本)。
您可以通过编写一个小的 C++ 程序来完成此操作,该程序创建一个 google::protobuf::compiler::java::JavaGenerator
and passes it into google::protobuf::compiler::PluginMain()
. You now have a program which reads a CodeGeneratorRequest
from standard input and writes a CodeGeneratorResponse
到标准输出。因此,您可以执行此程序以直接从 FileDescirptorProto
生成 Java 代码。将此代码传递给 Java 编译器取决于您。这应该比尝试生成要传递给 protoc
.