protobuf Serialize / Parse操作是双射的吗?

时间:2015-04-13 13:39:04

标签: c++ protocol-buffers

我正在编写一个计算和验证protobuf结构签名的应用程序。它的计算方式类似于sign(protobuf_message.SerializeAsString()) 我可以确定,相同的protobuf_message将是相同的序列化(使用不同版本的库(但仅使用proto2编码),在不同的计算机上,在不同的条件下),反之亦然?

1 个答案:

答案 0 :(得分:2)

Protobuf documentation精确定义了二进制消息格式。

特别是,它说:

  

虽然您可以在.proto中以任何顺序使用字段编号,但是当序列化消息时,其已知字段应按字段编号顺序写入,如提供的C ++,Java和Python序列化代码。这允许解析代码以使用依赖于字段序列的优化。但是,协议缓冲区解析器必须能够以任何顺序解析字段,因为并非所有消息都是通过简单地序列化对象来创建的 - 例如,通过简单地连接它们来合并两个消息有时很有用。

因此,只要您不通过连接其他消息来生成新消息,并使用protobuf库本身提供的序列化代码,序列化消息应该是相同的。如果您使用某些第三方protobuf绑定(例如C#),您应该检查它是否符合上述建议。