我想比较Google protocol buffers的两个消息或(两个子参数)。 我没有找到实现它的API。
有什么想法吗?
答案 0 :(得分:25)
您可以使用课程google::protobuf::util::MessageDifferencer。我认为它仅在v3.0.2之后才可用:
在google / protobuf / util中引入了新的实用程序函数/类 目录:
- MessageDifferencer:比较两个原型消息并报告它们之间的差异。
MessageDifferencer::Equals(msg1, msg2);
答案 1 :(得分:9)
您也可以使用message.DebugString
而不是
std::string strMsg;
message.SerializeToString(&strMsg);
用两个消息然后比较两个(二进制)字符串。我没有测试性能,但我认为它比比较.DebugString()返回的人类可读消息字符串更快。 +您可以使用protobuf-lite库(对于message.DebugString,您需要完整版本)。
答案 2 :(得分:8)
你可以依赖这样一个事实:你的所有protobuf消息都继承自google::protobuf::MesageLite
类型,而类型又拥有比较任何两个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());
}
答案 3 :(得分:0)
嗯,协议缓冲区只是某种对象类型的序列化格式。为什么不使用协议缓冲区重建原始对象,然后允许这些对象使用您在类中构建的任何比较逻辑来比较它们自己?
答案 4 :(得分:-1)
这可能不是理想的解决方案,但我认为可以通过以下方式完成:
messageA.DebugString() == messageB.DebugString();
除此之外,我认为唯一的解决方案是创建自己的Message
子类并实现bool operator==(const Message&)
。
答案 5 :(得分:-3)
您可以比较描述符的指针(超快):
if (mMessages[i]->body()->GetDescriptor() == T::descriptor())
mMessages它是一个带有header和crypto的网络消息池,它创建了一个带有protobuf主体的数据包(google :: protobuf :: Message *)。
所以,为了获得正确的消息,我比较描述符常量指针,这对于每种类型的消息都是相同的(不是%100肯定,但到目前为止我没有遇到任何问题)。
这将是比较一个protobuf消息的最快方法,而不必使用字符串比较,顺便说一句,你可以从描述符中获取类型名称。 : - )