web-dev-qa-db-ja.com

Googleプロトコルバッファの比較

Googleプロトコルバッファ の2つのメッセージまたは(2つのサブパラメータ)を比較したいと思います。それを実現するためのAPIが見つかりません。

何か案は?

28
dimba

これにはクラス google :: protobuf :: util :: MessageDifferencer を使用できます。 v3.0.2 からのみ利用可能だと思います:

Google/protobuf/utilディレクトリに新しいユーティリティ関数/クラスが導入されました。

  • MessageDifferencer:2つのプロトメッセージを比較し、それらの違いを報告します。

MessageDifferencer::Equals(msg1, msg2);

27
Amiga

すべてのprotobufメッセージが google::protobuf::MesageLite タイプ。これには、同じ派生タイプであるかどうかに関係なく、2つのprotobufメッセージを比較するために必要なすべてのものが含まれています。

bool operator==(const google::protobuf::MessageLite& msg_a,
                const google::protobuf::MessageLite& msg_b) {
  return (msg_a.GetTypeName() == msg_b.GetTypeName()) &&
      (msg_a.SerializeAsString() == msg_b.SerializeAsString());
}
7
Jake Askeland

message.DebugStringを使用する代わりに、次のこともできます。

std::string strMsg;
message.SerializeToString(&strMsg);

両方のメッセージを使用して、2つの(バイナリ)文字列を比較します。パフォーマンスはテストしていませんが、.DebugString()によって返される人間が読めるメッセージ文字列を比較するよりも高速であると思います。 +これはprotobuf-liteライブラリで実行できます(message.DebugStringの場合は、フルバージョンが必要です)。

7
Lorenz Winkler

さて、プロトコルバッファは、いくつかのオブジェクトタイプの単なるシリアル化形式です。プロトコルバッファを使用して元のオブジェクトを再構築し、クラスに組み込んだ比較ロジックを使用して、それらのオブジェクトを比較できるようにしてみませんか?

0
benjismith