访问协议缓冲扩展字段

时间:2016-10-04 11:28:11

标签: c++ c++11 inheritance protocol-buffers

我正在使用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 [Name / number]没有按预期工作?

2 个答案:

答案 0 :(得分:2)

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

const Reflection* ref = message_.GetReflection(); 
const FieldDescriptor* cfield = ref->FindKnownExtensionByNumber(33);

std::cerr << "cfield->name() " << cfield->name() << std::endl;

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

我还在等待更好/不同的解决方案,你们。

答案 1 :(得分:-1)

引用官方descriptor.h文档:

  

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

     
      
  • 然后获取包含范围的描述符或FileDescriptor   调用Descriptor :: FindExtensionByName()或   的FileDescriptor :: FindExtensionByName()。
  •   
  • 鉴于DescriptorPool,请致电   DescriptorPool :: FindExtensionByNumber()。
  •   
  • 给出一个反思   消息对象,调用Reflection :: FindKnownExtensionByName()或   反思:: FindKnownExtensionByNumber()。使用DescriptorPool   构建自己的描述符。
  •   

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