Googleプロトコルバッファ の2つのメッセージまたは(2つのサブパラメータ)を比較したいと思います。それを実現するためのAPIが見つかりません。
何か案は?
これにはクラス google :: protobuf :: util :: MessageDifferencer を使用できます。 v3.0.2 からのみ利用可能だと思います:
Google/protobuf/utilディレクトリに新しいユーティリティ関数/クラスが導入されました。
- MessageDifferencer:2つのプロトメッセージを比較し、それらの違いを報告します。
MessageDifferencer::Equals(msg1, msg2);
すべての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());
}
message.DebugString
を使用する代わりに、次のこともできます。
std::string strMsg;
message.SerializeToString(&strMsg);
両方のメッセージを使用して、2つの(バイナリ)文字列を比較します。パフォーマンスはテストしていませんが、.DebugString()によって返される人間が読めるメッセージ文字列を比較するよりも高速であると思います。 +これはprotobuf-liteライブラリで実行できます(message.DebugStringの場合は、フルバージョンが必要です)。
さて、プロトコルバッファは、いくつかのオブジェクトタイプの単なるシリアル化形式です。プロトコルバッファを使用して元のオブジェクトを再構築し、クラスに組み込んだ比較ロジックを使用して、それらのオブジェクトを比較できるようにしてみませんか?