是否可以在不使用代码生成的情况下读取 protobufs 编码的消息?
Is it possible to read a protobufs encoded message without using code generation?
当我解码 protobuf 编码数据时,我使用 parseFrom()
方法,该方法在 protoc
生成的代码中可用。
我想知道的是,有没有一种方法可以将协议缓冲区数据加载到某种通用对象中,并使用字段名称或标签号从中读取数据,而不使用代码生成?
这在 Avro 中可用 GenericRecord
。我想知道的是,protobuf中是否也有类似的能力。
找到了
将proto
文件编译成desc
文件
protoc --descriptor_set_out=point.desc --include_imports point.proto
加载 desc 文件。
InputStream input = new FileInputStream("point.desc");
DescriptorProtos.FileDescriptorSet descriptorSet = DescriptorProtos.FileDescriptorSet.parseFrom(input);
DescriptorProtos.FileDescriptorProto fileDescriptorProto = descriptorSet.getFile(0);
Descriptors.Descriptor messageDescriptor = Descriptors.FileDescriptor
.buildFrom(fileDescriptorProto, new Descriptors.FileDescriptor[0])
.findMessageTypeByName("Point");
使用加载的描述符解码数据。
DynamicMessage dynamicMessage = DynamicMessage.parseFrom(messageDescriptor, encodedBytes);
int x = (int) dynamicMessage.getField(messageDescriptor.findFieldByName("x"));
当我解码 protobuf 编码数据时,我使用 parseFrom()
方法,该方法在 protoc
生成的代码中可用。
我想知道的是,有没有一种方法可以将协议缓冲区数据加载到某种通用对象中,并使用字段名称或标签号从中读取数据,而不使用代码生成?
这在 Avro 中可用 GenericRecord
。我想知道的是,protobuf中是否也有类似的能力。
找到了
将
proto
文件编译成desc
文件protoc --descriptor_set_out=point.desc --include_imports point.proto
加载 desc 文件。
InputStream input = new FileInputStream("point.desc"); DescriptorProtos.FileDescriptorSet descriptorSet = DescriptorProtos.FileDescriptorSet.parseFrom(input); DescriptorProtos.FileDescriptorProto fileDescriptorProto = descriptorSet.getFile(0); Descriptors.Descriptor messageDescriptor = Descriptors.FileDescriptor .buildFrom(fileDescriptorProto, new Descriptors.FileDescriptor[0]) .findMessageTypeByName("Point");
使用加载的描述符解码数据。
DynamicMessage dynamicMessage = DynamicMessage.parseFrom(messageDescriptor, encodedBytes); int x = (int) dynamicMessage.getField(messageDescriptor.findFieldByName("x"));