2017-10-07 41 views
0

鑑於以下的原定義:擴展在proto3

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類型?

我來了,因爲這遠:

final Descriptors.Descriptor descriptor = SearchRequest.getDescriptor(); 

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

這是正確的方式?下一步是什麼?

回答

0

如這裏指出https://github.com/google/protobuf/issues/1460

自定義選項仍然支持。這是您可以在proto3中使用擴展的唯一地方。它的工作方式與proto2中的相同。不支持proto2的語言可能會提供一個特殊的API來訪問自定義選項,因爲它們不支持擴展。

所以定製選項似乎仍然支持,你應該使用

descriptor.findFieldByName("query").getOptions().getAllFields(); 

,將返回你地圖上您的自定義選項(如域)

final Map<Descriptors.FieldDescriptor, Object> allFields; 

而讓他們價值將是你的選擇,在你的情況下,投影機的類型。

此自定義選項(投影儀)的FileDescriptor似乎是以* .proto文件命名的類中使用其camelCase名稱生成的公共靜態。

如果原文件被稱爲search_service_v1.proto你可能會直接找到自定義選項,如下所示:

final DescriptorProtos.FieldOptions options descriptor.findFieldByName("query").getOptions(); 
final Object field = options.getField(SearchServiceV1.projector.getDescriptor()); 

你會通過

final Projector projector = Projector.class.cast(field); 
讓您的擴展