协议缓冲区序列化输出是否完全确定?

Fla*_*ien 5 protocol-buffers

给定协议缓冲区模式和一些数据,协议缓冲区序列化是否跨库和语言具有确定性?

基本上,无论使用什么库,我是否可以保证相同的数据总是以相同的方式(直到字节)序列化?

jpa*_*jpa 4

一般来说,相同的数据将以完全相同的方式序列化。

然而,protobuf 规范并不能保证这一点。例如,以下编码差异是允许的,并且必须在所有符合标准的库中解码为相同的结果:

  • 以与标签编号顺序不同的顺序对字段进行编码。
  • 将打包字段编码为未打包字段。
  • 将整数编码为比所需更长的 varint 字节序列。
  • 对相同(非重复)字段进行多次编码。
  • 可能是其他人。

  • 在 proto3 中,我看到涉及“map”的消息以不同的方式序列化,至少在 Ruby 中,它由类似哈希的结构 Google::Protobuf::Map 表示。在不同的等效映射上调用“keys”会产生不同的顺序,相应地,序列化似乎以相同的方式不同(我看到字节块的排序方式与“keys”相同)。规范确实说“map”不保证排序;这似乎是一个公平的结果。 (4认同)