什么时候使用固定值 protobuf 类型?或者在什么场景下?
When to use fixed value protobuf type? Or under what scenarios?
我想通过 TCP 传输序列化的 protobuf 消息,我尝试使用第一个字段来指示序列化消息的总长度。
我知道int32
编码后会改变长度。所以,也许 fixed32
是一个不错的选择。
但是在编码章节的最后,我发现即使我使用带 field_num #1 的 fixed32 我也不能依赖它。因为Field Order说顺序可能会变
我的问题是什么时候使用固定值类型?有没有示例场景?
"My question is when do I use fixed value types?"
在序列化值时,总是需要权衡取舍。如果我们查看 Protobuf-documentation,我们会发现在涉及 32 位整数时我们有几个选项:
int32: Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
uint32: Uses variable-length encoding.
sint32: Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
fixed32: Always four bytes. More efficient than uint32 if values are often greater than 2^28.
sfixed32: Always four bytes.
int32
是可变长度数据类型。类型本身未指定的任何信息都需要以某种方式表达。要反序列化一个可变长度的数字,我们需要知道长度是多少。这也包含在序列化消息中,这需要额外的存储 space。可选的负号也是如此。因此,生成的消息可能会更小,但也可能会更大。
假设我们有很多 0 到 255 之间的整数要编码。将此信息作为两个字节发送(一个字节具有该实际值,一个字节表示我们只有一个字节)比发送完整的 32 位(4 字节)整数更便宜 [虚构值,实际执行可能不同]。另一方面,如果我们想要序列化一个只能容纳 4 个字节的大值,结果可能会更大(4 个字节和一个额外的字节来指示该值是 4 个字节;总共 5 个字节)。在这种情况下,使用 fixed32
会更有效。我们只知道 fixed32
是 4 个字节;我们不需要序列化 fixed32
是一个 4 字节的数字。
如果我们查看 fixed32
,它实际上提到权衡点在 2^28 左右(对于无符号整数)。
所以有些类型很好 [例如,在存储方面更有效 space] 对于大值,一些对于小值,一些对于 positive/negative 值。这完全取决于实际值代表什么。
"Are there any example scenarios?"
32 位哈希(即:CRC-32),IPv4 addresses/masks。可预测的消息大小可能是相关的。
我想通过 TCP 传输序列化的 protobuf 消息,我尝试使用第一个字段来指示序列化消息的总长度。
我知道int32
编码后会改变长度。所以,也许 fixed32
是一个不错的选择。
但是在编码章节的最后,我发现即使我使用带 field_num #1 的 fixed32 我也不能依赖它。因为Field Order说顺序可能会变
我的问题是什么时候使用固定值类型?有没有示例场景?
"My question is when do I use fixed value types?"
在序列化值时,总是需要权衡取舍。如果我们查看 Protobuf-documentation,我们会发现在涉及 32 位整数时我们有几个选项:
int32: Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
uint32: Uses variable-length encoding.
sint32: Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
fixed32: Always four bytes. More efficient than uint32 if values are often greater than 2^28.
sfixed32: Always four bytes.
int32
是可变长度数据类型。类型本身未指定的任何信息都需要以某种方式表达。要反序列化一个可变长度的数字,我们需要知道长度是多少。这也包含在序列化消息中,这需要额外的存储 space。可选的负号也是如此。因此,生成的消息可能会更小,但也可能会更大。
假设我们有很多 0 到 255 之间的整数要编码。将此信息作为两个字节发送(一个字节具有该实际值,一个字节表示我们只有一个字节)比发送完整的 32 位(4 字节)整数更便宜 [虚构值,实际执行可能不同]。另一方面,如果我们想要序列化一个只能容纳 4 个字节的大值,结果可能会更大(4 个字节和一个额外的字节来指示该值是 4 个字节;总共 5 个字节)。在这种情况下,使用 fixed32
会更有效。我们只知道 fixed32
是 4 个字节;我们不需要序列化 fixed32
是一个 4 字节的数字。
如果我们查看 fixed32
,它实际上提到权衡点在 2^28 左右(对于无符号整数)。
所以有些类型很好 [例如,在存储方面更有效 space] 对于大值,一些对于小值,一些对于 positive/negative 值。这完全取决于实际值代表什么。
"Are there any example scenarios?"
32 位哈希(即:CRC-32),IPv4 addresses/masks。可预测的消息大小可能是相关的。