在这篇文章中:Google 协议缓冲区比较,我看到了几种在 C++ 中比较 protobuf 消息的方法。
我尝试使用
msg.DebugString()
、SerializeToString()
和 MessageDifferencer::Equal()
进行有效负载比较。这三种方法给出了不同的结果:
DebugString
显示两条消息相等,而另外两条则显示不相等。
由于消息太长(>2000字节),并且多层递归,所以不太容易看出差异。
有人知道这些方法有什么区别,最好选择哪种吗?
编辑: 另一个不错的选择:protobuf matcher
MessageDifferencer
可能是最安全的方法,因为像地图这样的东西在消息中可能有不确定的顺序。但您可能想使用 Equivalent()
而不是 Equal()
,因为前者稍微不那么迂腐(例如,允许在缺失字段中使用默认值)。
您可以处理生成的报告条目,例如,如果顺序对于处理数据的方式并不重要,则忽略消息中已移动的字段。
选择
MessageDifferencer::Equal()
。
序列化不能保证是确定性的,即,无论出于何种原因,相同的消息可能会以不同的方式序列化(例如,在大多数情况下,字段顺序可能不同)(它在库版本之间明显不同,但例如解析序列化往返可能会保留字段顺序,并且因此不会取消差异)。
而且
DebugString
看起来它是为了调试而不是为了比较,所以我什至不会考虑它。