在添加一个布尔字段的情况下,PB消息的序列化大小增加2个字节?

时间:2011-04-23 13:57:45

标签: java protocol-buffers

我正在构建包含4个int32字段的PB消息。我想在此消息中添加两个布尔字段。我注意到2个布尔字段的大小增加了4个字节。布尔值每个字段占用2个字节。它们不能以更紧凑的形式存储吗?

3 个答案:

答案 0 :(得分:2)

每个字段标题占用1个字节(对于低字段编号;对于大字段编号,更多),每个字段占用1个字节。 protobuf中没有子字节打包;事情四舍五入到最接近的字节。

1选项是存储无符号整数映射 - 即。将每个bool视为2的幂并将它们加起来(按位)。然后你需要一个字节头和一个字节数据,因此两个字节都需要2个字节。但是,您必须自己打包/解包整数。假设您有一个低字段编号,那么最多7个bool就是1个字节的数据加上1个字节的标题。由于“varint”使用base-128编码(msb是continuation),因此第8个bool(最多14个bool)将占用2个字节数据加1个字节的头部。

答案 1 :(得分:0)

这并不奇怪。它可能使用一个字节作为以下值的类型标志,然后将该位存储在一个字节中。您可以将多个位打包成一个整数类型(char中为8,short中为16,int中为32),以实现更高效的传输。节省带宽是否值得编写和运行打包代码的麻烦取决于您的应用程序。

答案 2 :(得分:0)

在空间与访问时间之间总是存在权衡。

您的JVM设计师可以通过多种方式进行权衡。可能他选择坚持结构总是占用4个字节的倍数,因此每个结构都是长字对齐的。可能他认为布尔应该占用两个字节,因为这使得解决更简单。可能是他在一个字节中为两个布尔值分配了一个比特,然后将其填充到两个字节的边界。

如果不确切知道结构是如何布局的,以及如何使用布尔值,那么你就无能为力了。