使用packed = true原型文件读取非压缩重复字段

时间:2014-01-15 20:38:28

标签: c++ protocol-buffers

我刚刚意识到有一个选项可以更有效地使用协议缓冲区来读/写基元数组。我已经有没有packed = true的protobuf文件。我的问题是当我将此选项添加到我的.proto并编译它时会发生什么。我是否能够读取以前保存的protobufs(未使用此选项保存)?

repeated int32 samples = 4 [packed=true];

2 个答案:

答案 0 :(得分:4)

从版本2。3。0(2010年1月)开始,Google编写的Protobufs实现(在C ++,Java和Python中)可以在解析时接受任何格式的数据。 packed设置仅告知实现写入时使用的格式。请参阅the changelog(v2.3.0下的第一项)。

版本2.1(当引入打包字段时)和2.2 具有此属性 - 这些版本中的解析器仅接受打包格式的[packed=true]字段,而非{{ 1}}非压缩格式的字段。

第三方实施可能支持也可能不支持此功能。你必须检查他们的文档,或者写一个测试。

答案 1 :(得分:0)

我没有100%肯定的答案,您应该能够通过快速测试验证这一点,但如果您查看wire format specification,您就会找到有线格式包装的字段。但是,由于标签名称和电线类型可以清楚地识别,因此您应始终读取序列化的protobuf,即使发生了一些疯狂的事情并且您有多个打包值多个解压缩的值,全部用于同一个字段。他们只会被连接起来。 packed选项应该主要决定如何原型。

确实要做一个测试用例。

当然,您的读者至少需要支持Proto 2.1.0。