【问题标题】:Is protocol buffer serialization output fully deterministic?协议缓冲区序列化输出是否完全确定?
【发布时间】:2015-07-03 14:03:52
【问题描述】:

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

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

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这正是我想知道的。
    • @Flavien 请注意,只要不存在未知字段,大多数 protobuf 实现(包括官方实现)将始终以规范格式编写 proto。
    • 对于 proto3,我已经看到涉及 map 的消息以不同的方式序列化,至少在 Ruby 中,它由类似哈希的结构 Google::Protobuf::Map 表示。在不同的等效 Maps 上调用 keys 会产生不同的排序,相应地,序列化似乎以相同的方式不同(我看到字节块的排序方式与 keys 的排序方式相同)。规格确实说map 不保证订购;这似乎是一个公平的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2013-09-16
    • 2016-11-10
    相关资源
    最近更新 更多