如何比较protobuf消息

问题描述 投票:0回答:2

在这篇文章中:Google 协议缓冲区比较,我看到了几种在 C++ 中比较 protobuf 消息的方法。

我尝试使用

msg.DebugString()
SerializeToString()
MessageDifferencer::Equal()
进行有效负载比较。这三种方法给出了不同的结果:

DebugString
显示两条消息相等,而另外两条则显示不相等。

由于消息太长(>2000字节),并且多层递归,所以不太容易看出差异。

有人知道这些方法有什么区别,最好选择哪种吗?

编辑: 另一个不错的选择:protobuf matcher

c++ protocol-buffers
2个回答
1
投票

MessageDifferencer
可能是最安全的方法,因为像地图这样的东西在消息中可能有不确定的顺序。但您可能想使用
Equivalent()
而不是
Equal()
,因为前者稍微不那么迂腐(例如,允许在缺失字段中使用默认值)。

您可以处理生成的报告条目,例如,如果顺序对于处理数据的方式并不重要,则忽略消息中已移动的字段。


0
投票

选择

MessageDifferencer::Equal()

序列化不能保证是确定性的,即,无论出于何种原因,相同的消息可能会以不同的方式序列化(例如,在大多数情况下,字段顺序可能不同)(它在库版本之间明显不同,但例如解析序列化往返可能会保留字段顺序,并且因此不会取消差异)。

而且

DebugString
看起来它是为了调试而不是为了比较,所以我什至不会考虑它。

© www.soinside.com 2019 - 2024. All rights reserved.