如何获得与协议缓冲区字段关联的选项?
例如,假设我有一个带有自定义选项的字段:
message Foo {
optional string title = 1 [(indexed) = true];
}
Run Code Online (Sandbox Code Playgroud)
我可以获得字段列表:
for f in foo.ListFields():
print f
Run Code Online (Sandbox Code Playgroud)
如何访问“已建立索引”状态?(我可以看到有一个f“ _options”列表,但看起来是“ internal”?是否有按名称访问选项扩展的正确方法)?
我会作为一个例子使用nanopb自定义选项,定义在这里。但是答案本身并不是特定于nanopb的,nanopb使用标准的protobuf样式来定制选项:
message NanoPBOptions {
optional int32 max_size = 1;
...
}
extend google.protobuf.FieldOptions {
optional NanoPBOptions nanopb = 1010;
}
Run Code Online (Sandbox Code Playgroud)
和这样定义的选项:
message Person {
optional string email = 3 [(nanopb).max_size = 40];
}
Run Code Online (Sandbox Code Playgroud)
用来获取选项值的API在不同语言之间是不同的。但是基本流程是相同的:
在Python中:
desc = person_pb2.Person.DESCRIPTOR
field_desc = desc.fields_by_name['email']
options = field_desc.GetOptions()
value = options.Extensions[nanopb_pb2.nanopb].max_size
Run Code Online (Sandbox Code Playgroud)
在Java中:
desc = PersonProto.Person.getDescriptor();
field_desc = desc.findFieldByName("email");
options = field_desc.getOptions();
value = options.getExtension(Nanopb.nanopb).getMaxSize();
Run Code Online (Sandbox Code Playgroud)
在C ++中:
desc = Person::descriptor()
field_desc = desc->FindFieldByName("email");
options = field_desc->options();
value = options.GetExtension(nanopb).max_size());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1536 次 |
最近记录: |