2017-07-05 7 views
0

私はカスタムオプションを使用する必要があるprotocプラグインを作成しようとしています。例(https://developers.google.com/protocol-buffers/docs/proto#customoptions)に示すように、私は私のカスタムオプションを定義した:カスタムprotocプラグインの解析がカスタムオプションで機能しない

import "google/protobuf/descriptor.proto"; 

extend google.protobuf.MessageOptions { 
    string my_option = 51234; 
} 

次のように私はそれを使用する:

message Hello { 
    bool greeting = 1; 
    string name = 2; 
    int32 number = 3; 

    option (my_option) = "telephone"; 
} 

私が解析された要求を読んだときただし、オプションフィールドが空いたとき"こんにちは"メッセージ。

私が見て、オプションフィールドは、私はオプションを定義していても空であるとして、私は「要求、」それはちょうど私にこの

を与える
message_type { 
    name: "Hello" 
    field { 
    name: "greeting" 
    number: 1 
    label: LABEL_REQUIRED 
    type: TYPE_BOOL 
    json_name: "greeting" 
    } 
    field { 
    name: "name" 
    number: 2 
    label: LABEL_REQUIRED 
    type: TYPE_STRING 
    json_name: "name" 
    } 
    field { 
    name: "number" 
    number: 3 
    label: LABEL_OPTIONAL 
    type: TYPE_INT32 
    json_name: "number" 
    } 
    options { 
    } 
} 

を印刷するとき

data = sys.stdin.read() 

request = plugin.CodeGeneratorRequest() 
request.ParseFromString(data) 

を読むために次のことをやっています私の.protoファイルにあります。カスタムオプションを定義するために私の構文が間違っていますか?それとも、私のバージョンのprotocに問題がありますか?

+1

データはoptionsオブジェクトの* extensions *です。拡張APIを使用しましたか?カスタムオプションを読み込むには、拡張APIを使用する必要があります。それが存在するかどうかを確認するには、descriptor-set-outputを使用してファイルをhttps://protogen.marcgravell.com/decodeにアップロードします。すべてのフィールドを表示するために任意のファイルを取り出します。 –

+0

@MarcGravell!私は拡張APIを使いこなしてきましたが、オプションに加えられた拡張をリストアップすることはできません。これは私がこれまで持っていたものです。あなたはそのオブジェクト内の要素にアクセスする手助けをしてもらえますか? 'd = msg.DESCRIPTOR.GetOptions()。拡張子' msgは私のプロトファイル内のメッセージです – staleMilk

+1

まあ、どの言語/フレームワークを使用していますか?拡張にアクセスするための構文は、それに依存します。 C++の例がここにあります:https://developers.google.com/protocol-buffers/docs/proto#extensions –

答えて

0

カスタムオプションが定義されている.protoファイル用に_pb2.pyファイルをインポートする必要があります。たとえば、で定義されたカスタムオプションを使用するexample.protoというファイル(ParseFromStringを使用している)を解析する場合は、ParseFromStringを呼び出すPythonファイルにoption_pb2.pyをインポートする必要があります。

関連する問題