访问协议缓冲区扩展字段

Access protocol buffers extension fields

本文关键字:字段 扩展 缓冲区 协议 访问      更新时间:2023-10-16

我正在使用c++中的协议缓冲区。我的留言只有一个扩展范围。我想访问所有的扩展字段,不知道他们的名字,只使用他们的数字。我该怎么做??

message Base {
    optional int32 id = 1;
    extensions 1000 to 1999;     
}
extend Base{
    optional int32 id2 = 1000;
}

到目前为止,我已经获得了ExtensionRange。

const google::protobuf::Descriptor::ExtensionRange* rng = desc->extension_range(0);
std::cerr << "rng " << rng->start << " " << rng->end << std::endl;

但是我不知道如何得到扩展的Fielddescriptor*

有一件奇怪的事情,那就是extension_count()返回0。虽然我在我的。proto文件中使用了扩展名。同样FindExtensionBy[名称/号码]不工作如预期?

我找到了使用反射的解决方案。

const Reflection* ref = message_.GetReflection(); 
const FieldDescriptor* cfield = ref->FindKnownExtensionByNumber(33);
std::cerr << "cfield->name() " << cfield->name() << std::endl;

现在我现有的解决方案将是循环在扩展范围内的所有数字,并获得所需的扩展字段描述符。

我仍然在等待更好的/不同的解决方案,伙计们。

引用descriptor.h官方文档:

要获取扩展的FieldDescriptor,请执行以下操作之一:

  • 获取其包含范围的描述符或FileDescriptor,然后调用描述符::FindExtensionByName()或FileDescriptor: FindExtensionByName()。
  • 给定一个描述池,调用DescriptorPool: FindExtensionByNumber()。
  • 给出a的反射message对象,调用Reflection::FindKnownExtensionByName()或反射:FindKnownExtensionByNumber()。使用DescriptorPool来构建你自己的描述符

extension_count()返回0的原因是它告诉您嵌套扩展声明的数量(用于其他消息类型)。