访问协议缓冲区扩展字段
Access protocol buffers extension fields
我正在使用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的原因是它告诉您嵌套扩展声明的数量(用于其他消息类型)。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 从C++访问协议缓冲区扩展重复字段
- 访问协议缓冲区扩展字段
- 消息扩展名不能有必需的字段