首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >proto3中的扩展

proto3中的扩展
EN

Stack Overflow用户
提问于 2017-10-07 10:07:24
回答 1查看 5K关注 0票数 3

鉴于以下原语定义:

代码语言:javascript
复制
syntax = "proto3";

import "google/protobuf/descriptor.proto";

option java_package = "com.example.dto";

option java_multiple_files = true;

extend google.protobuf.FieldOptions {
    Projector projector = 50002;
}

message Projector {
    string name = 1;
    string class = 2;
    bool default = 3;
}

message SearchRequest {
    string query = 1 [(projector) = {name: "queryProjector", class: "foobar"}];
    int32 page_number = 2;
    int32 result_per_page = 3;
}

如何访问字段扩展?

据我所知,扩展仍然在proto3中工作,但通常被Any类型所取代?

我走了这么远

代码语言:javascript
复制
final Descriptors.Descriptor descriptor = SearchRequest.getDescriptor();

final Descriptors.FieldDescriptor query = descriptor.findFieldByName("query");

这条路对吗?下一步是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-02-15 13:38:36

如前所述,https://github.com/google/protobuf/issues/1460

仍然支持自定义选项。这是您在proto3中唯一可以使用扩展的地方。它的工作方式与在proto2中相同。不支持proto2的语言可能会提供一个特殊的API来访问自定义选项,因为它们不支持扩展。

因此,自定义选项似乎仍然受到支持,您应该使用

代码语言:javascript
复制
descriptor.findFieldByName("query").getOptions().getAllFields();

这将返回自定义选项的映射(作为字段)。

代码语言:javascript
复制
final Map<Descriptors.FieldDescriptor, Object> allFields;

而该值将是您的选择类型,投影仪在您的情况下。

这个自定义选项(投影仪)的FileDescriptor似乎是在以*.proto文件命名的类中以公共静态的形式使用其camelCase名称生成的。

如果您的proto文件名为search_service_v1.proto,您可以直接找到自定义选项,如下所示:

代码语言:javascript
复制
final DescriptorProtos.FieldOptions options descriptor.findFieldByName("query").getOptions();
final Object field = options.getField(SearchServiceV1.projector.getDescriptor());

你会得到你的分机

代码语言:javascript
复制
final Projector projector = Projector.class.cast(field);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46619005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档