是否可以在不使用代码生成的情况下读取 protobufs 编码的消息?

Is it possible to read a protobufs encoded message without using code generation?

当我解码 protobuf 编码数据时,我使用 parseFrom() 方法,该方法在 protoc 生成的代码中可用。

我想知道的是,有没有一种方法可以将协议缓冲区数据加载到某种通用对象中,并使用字段名称或标签号从中读取数据,而不使用代码生成?

这在 Avro 中可用 GenericRecord。我想知道的是,protobuf中是否也有类似的能力。

找到了

  1. proto文件编译成desc文件

     protoc --descriptor_set_out=point.desc --include_imports point.proto
    
  2. 加载 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");
    
  3. 使用加载的描述符解码数据。

     DynamicMessage dynamicMessage = DynamicMessage.parseFrom(messageDescriptor, encodedBytes);
    
     int x = (int) dynamicMessage.getField(messageDescriptor.findFieldByName("x"));