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