2016-10-04 59 views
6

我正在使用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]不能按预期工作?

+1

check boost ::你正在使用的函数:http://stackoverflow.com/questions/7870600/boostbind-call-to-empty-boostfunction-fails-only-if-not-set-in-constructor – PiotrNycz

+0

@ PiotrNycz,我改变了问题陈述。 – v78

回答

2

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

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

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

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

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

+0

请注意,上面的代码是'using namespace google :: protobuf' –

-1

从官方descriptor.h文档举:

要获得FieldDescriptor延期,请执行下列操作之一:

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

为什么extension_count()将返回0的原因是,它会告诉你嵌套分机号码声明(其他消息类型)。