10

これが私が理解しようとしているものです.彼らのドキュメントは、少なくとも私にはこれを十分に説明していません..

シナリオ:

C++ の protoc で生成した 5 つの proto ファイルがあります。私のアプリケーションはメッセージを受信し、値と名前にアクセスしながらすべてのフィールドを反復処理できる必要があります。

私がやりたいことは、メッセージを DynamicMessage クラスに解析してから、フィールドを反復処理することです。この方法では、メッセージが何であるかを正確に知る必要がなく、単一の一般的な方法ですべてを処理できます。

メッセージを特定のタイプに解析してメッセージ基本クラスとして扱うことでメッセージを処理できることはわかっていますが、私のアプリケーションではそれは望ましくありません。

「--descriptor_set_out」と動的メッセージクラスを介して、私がやりたいことが可能になるようです。

私が試したこと(そして失敗したこと):

私は、descriptor.proto を自分の proto と一緒にフォルダーに移動し、コンパイルのステップで他のものと一緒に含めました。また、--descriptor_set_out フラグを設定して、ファイル「my_descriptors.pb.ds」に出力します。

そこからどこに進むべきかわかりません。

あまり多くはありませんが、私が参照したものは次のとおりです... 長い投稿と、トピックの命名規則がやや曖昧で申し訳ありません。

また、明確でない場合、メッセージは「不明」ではないと仮定します。私のコードが「不明な」メッセージの処理を認識できるように、各プロトにそれぞれのヘッダーを含める必要があると思います。

4

2 に答える 2

0

最も一般的な方法は、メッセージ構成を使用することです。何かのようなもの:

message Foo {...}
message Bar {...}
message GenericMessage {
    enum Type {FOO = 1, BAR = 2};
    optional Foo foo = 1;
    optional Bar bar = 2;
}

またはのいずれFooBarがそれぞれに存在することを確認するGenericMessageと、目的の動作が得られます。1 つを読み取りGenericMessage、いくつかの特定のメッセージの 1 つとして処理します。

プロトコルのリファクタリングについて考えてみてください。フィールドを反復するだけでよい場合は、単純なキーと値のマップのようなものを使用したほうがよいでしょう。

message ValueMessage {
    required string key = 1;
    optional int IntValue = 2;
    optional string StringValue = 3;
    optional bool BoolValue = 4;
    ...
}
message GenericMessage{
    repeated ValueMessage = 1;
}

または、別の方法でプロトコルをリファクタリングすることもできます。

于 2013-06-01T19:52:08.907 に答える
0

警告: 私の答えは完全には正しくありません。競合に関するコンパイル エラーがいくつかあります。修正したら編集します :)。しかし、これは出発点です

この質問が投稿されてから長い時間が経ったかもしれませんが、今日、プロトコルバッファーを使用して同様のことに直面しました。

まず、参照が間違っています。追加する必要があるコマンドのオプションは次のとおりです。

--descriptor_set_out=<Directory>

whereDirectoryは、descriptor.protoのコンパイル済みバージョン(またはファイルを記述する .proto コンパイル済み) の場所です。

この後、自動記述 .proto ファイルに Descriptor.proto ファイルへの参照を追加する必要があります。

message MyMessage
{
    required google.protobuf.FileDescriptorSet proto_files = 1;
    ...
}
于 2015-06-26T09:18:53.257 に答える