访问协议缓冲区扩展字段

7

我正在使用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
请检查您正在使用的boost::function:http://stackoverflow.com/questions/7870600/boostbind-call-to-empty-boostfunction-fails-only-if-not-set-in-constructor - PiotrNycz
@PiotrNycz,我修改了问题陈述。 - v78
2个回答

2
我使用反射找到了一个解决方案。
const Reflection* ref = message_.GetReflection(); 
const FieldDescriptor* cfield = ref->FindKnownExtensionByNumber(33);

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

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

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


请注意,以上代码使用了命名空间 google::protobuf - Robin Nabel

-1

引用自官方 descriptor.h 文档:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接