0

Google protobuf ライブラリ バージョン 2.61 を使用していて、拡張機能を使用したいのですが、

次の proto ファイルがあります。

package communication;

message BaseMessage {
  required uint64 server_id     = 1;
  required string uuid          = 2;
  required uint64 message_id    = 3;

  extensions 100 to max;
}

message GetIdentify {

  extend BaseMessage {
    optional GetIdentify message = 100;
  }

  required string hostname = 1;
}

次のコードを使用してメッセージを作成できます。

communication::BaseMessage base_message;
base_message.set_message_id(123456);
base_message.set_server_id(112313123);
base_message.set_uuid("asdaskdjasd213123123asd");
base_message.MutableExtension(communication::GetIdentify::message)->set_hostname("http://test123123123ing");

ただし、反対のアクションを実行して、拡張子が不明なメッセージを取得して解析し、それがどの拡張子であるかを見つけて、それに応じて解析したいと思います。

CプロジェクトとPythonバージョンにnanopbを使用しました。しかし、十分なドキュメントやコード例が見つからないため、c++ で protobuf コードを書くのは本当に難しいと思います。

拡張子のタイプの変数を追加せずにこれを行う方法はありますか?

また、C ++でこれを行う最もエレガントな方法は何ですか?

4

1 に答える 1

0

ライブラリ解析メッセージとすべての拡張子。HasExtension メソッドを使用して拡張機能の存在を確認できます。

Java 実装では、解析する前に拡張機能をパーサーに登録する必要があります。しかし、C++ ではすべてが自動的に行われます。次のコードを参照してください。(protobuf 2.5.0でテストしました)

メッセージの作成と書き込み:

#include <iostream>
#include <fstream>
#include <string>
#include <communication/p.pb.h> 
using namespace std;

int
main(int, char **)
{
    communication::BaseMessage base_message;
    base_message.set_message_id(123456);
    base_message.set_server_id(112313123);
    base_message.set_uuid("asdaskdjasd213123123asd");
    base_message.MutableExtension(communication::GetIdentify::message)->set_hostname("http://test123123123ing");
    base_message.SerializeToOstream(&cout);
    return 0;
}

メッセージを読み、拡張機能をテストして印刷します。

#include <iostream>
#include <fstream>
#include <string>
#include <communication/p.pb.h>
#include <google/protobuf/text_format.h>
using namespace google::protobuf;
using namespace std;

int
main(int, char **)
{
    communication::BaseMessage base_message;
    base_message.ParseFromIstream(&cin);

    if (base_message.HasExtension(communication::GetIdentify::message)) {
        const communication::GetIdentify &ii = base_message.GetExtension(communication::GetIdentify::message);
        cout << "yes, msg has extension: " << ii.hostname() << endl << endl;
    } else {
        cout << "no, msg has no extension" << endl << endl;
    }

    string res;
    TextFormat::PrintToString(base_message, &res);

    cout << res << endl;
    return 0;
}
于 2016-08-16T09:49:24.853 に答える