当前位置: 首页 > 网络应用技术

Protobuf语法和实施原则

时间:2023-03-07 19:20:18 网络应用技术

  本文介绍了Protobuf协议语法和Protobuf序列化原则。

  Protobuf序列化后生成的二进制消息非常紧凑,这是由于Protobuf.next使用的非常巧妙的编码方法,请看一下Protobuf协议如何实现有效编码。

  我以前已经描述过。Protobuf的消息中有许多字段。每个字段的格式是:

  VARINT是表示数字的紧凑方法。它使用一个或多个字节来表示数字。数量数越小,字节数越少。这可以减少用来表示数字的字节数。

  Varint中每个字节的最高位具有特殊的含义。如果该位是1,则意味着后续字节也是数字的一部分。如果位是0,则结束。其他7位用于表示数字。因此,小于128的数字可以由一个字节表示。数字大于128,例如300,例如两个字节:1010:101011000000 0010。下面的图说明了Google协议缓冲区如何分析两个字节。注意到在最终计算之前,两个字节的位置互相交换一次,因为Google协议协议Buffer Byte订单采用了小范围方法。

  在序列化过程中,根据tlv的格式,tlv是标签,也称为键,由每个字段序列化。v是对应于字段的值的值;L是值的长度。如果字段是塑料的,则该部分将省略L部分的部分。

  序列化值根据原始值保存在字符串或文件中,并且根据某些转换条件保存键。序列化的结果是KeyValueKeyKeyValue ...

  此密钥对结构用于在不使用分离器的情况下对不同的字段进行划分。对于可选字段,如果消息中没有字段,则最终消息缓冲区中没有此类字段。这些特征有助于节省消息本身的大小。例如,我们有新闻顺序1:

  然后,最终消息缓冲区中有两个键值对,一个在相应的消息中。另一个对应于desc.key来识别特定字段。解开包装时,协议缓冲区可以知道哪个字段应根据密钥对应于相应的值。

  密钥的定义如下:

  您可以看到密钥由两个部分组成。第一部分是field_number。例如,消息中的字段ID的字段_number为1。第二部分是wire_type。指示值类型。和wire_type具有以下类型:

  原始:https://juejin.cn/post/7101533934818689031