最后更新:2022-05-03 12:35:03 手机定位技术交流文章
Protocol Buffers这是一种轻量级和有效的数据储存格式,可用于组织数据测序,最适合数据储存或检索。RPC可在通信协议、数据储存等领域的语文相关、平台相关和综合数据表格中加以利用。
它有以下特点:
C++、Java和Python等;Google开源的二进制RPC通讯协议;Protobuf没有限制, 因此没有头条标题。 标题通常由用户指定, 用户通常使用长度前缀来创建边界 。
同样Protobuf也没有指定信件类型。 当服务器收到一串信件时, 它必须确定匹配类型, 然后选择编码器来读取信件。 此类型的信息也必须由信头中的用户提供 。
网络协议是一套规范计算机网络数据流动的规则、标准或协议。由于计算机与网络连接,二进制协议会发生变化。JSON类似此文本文件的文本文件, 但不完全相同BSON这样的二进制数据。
二进制协议是一个字节流, 可能包含信头, 也可能不包括信头 。header)和消息体(body信件信头的长度是固定的, 标题包含信件正文的长度。 这样就可以从数据流中提取全部二进制数据 。 以下为典型的二进制协议结构模型 :

其中,
Guide用于标识协议起始;Length是消息体Data,连同必要的核查(为数据完整性的目的)DataCRC、HeaderCRC);Data中又分为命令字(CMD命令词定义在相互商定的文档中,例如登录为 0x01,注销为 0x02,等等,常规数据字段的长度是固定的。由于固定长度,多余数据减少,传输效率提高。优点
缺点
文本协议通常以字符串表示 。ACSII字符构成详情,包括数字、案件信函、百分比数字和回程车。r)、换行(n)以及空格等等。
文本协议旨在帮助理解和理解,因此,在协议中通常增加特殊字符,例如以下数据,以便加以划分。
这是一个书面的方向,我们可以看到它的眼睛 即使它没有意义。git里面的commit指令,-m随后是描述性数据的最新输入。
然而,文本协议必须包括不必要的字符,为便于理解而分别订购,限制其传输的效率;它只适用于文本传输,因此不可能插入其他数据,如图像、乐谱等。
优点
缺点
我们描述了文本协议和二元协议的利弊:
所以:
RPC(c) 接口电话等使用文本协议;Protobuf源码已在GitHub
com/protocolbuffers/protobubuf。
com/protocol-buffers/. com/protocol-buffers/. com/protocol-buffers/。
以下示例默认使用proto3库编写。
Protobuf传输是密钥对的序列,如果连续按键重复,则数值为列表。repeated。图中的key3就是一个列表类型repeated。
键key两部分组成:tag和type。
Protobuf将正序( tag)与项目中每个字段匹配。所创建的代码确保了必要的信息。在排序过程中,用整数值取代字段名称。因此,传输通信量可以急剧减少。如果字段较少,上面写着四位数最多可容纳16个田地。如果字段数超过16,之后再添加一个字节。如果这还不够,请再加一个字节。你也许猜到了,这个tag值使用的是varint编码。 字段的长度没有理论限制, 因为varint扩展字节可容纳任何大小的任何非负整数。
Protobuf字段类型也与正序(类型)匹配,每个原始的java类型只与一个正整数相关,使类型信息非常高效。type使用三位元表示最多支持八种。
也许你会得出结论 八类就足够了放心,肯定够的!由于zigzag类型可以指任何整数类型,在(未签署的)长/长/无/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年
Python语言的数量更加独特。它不区分整数和非整数。它甚至可能是一个大整数。这是华林的专长领域。它有能力永远增加地点的数量。这可以写成无限数的整数 。长度有限的类型可以代表字节数组、字符串和嵌套对象。此外,每个浮动和双重类型都属于一种类型。最终你看,使用的只有8种不同类型。
Protobuf的整数数值使用zigzag编码。zigzag编码支持负数值,varint编码的都是非负数。
浮点数分为float和double它们分别占4和6个字节。value这是正常的浮点数, 没有任何额外的处理 。
Protobuf第一个字节代表字符串的长度,而相应的长度的后继字节是字符串的内容。如果字符串大,则其长度前缀大于一个字节,可能为两个字节、三个字节或四个字节,而您本来会预计使用这一长度。varint编码。
通过.proto当相关代码文件由文件汇编时,proto3以下是界定的数据结构与汇编的数据结构的比较:
| Type | C++ Type | Java Type | Notes |
|---|---|---|---|
| double | double | double | |
| float | float | float | |
| int32 | int32 | int | 编码负值效率低下;如果字段可能包含负值,请使用 Sint32 。 |
| int64 | int64 | long | 工作长度编码变量。 负编码无效; 如果您的字段含有负值, 请使用 Sint64 。 |
| uint32 | int | uint32 | |
| uint64 | long | uint64 | |
| sint32 | int | uint32 | 使用可变长度编码。 带有符号的整数值比标准的 It32 编码更有效 。 |
| sint64 | long | uint64 | 使用可变长度编码。 带有符号的整数值比标准的 int64 编码更有效 。 |
| fixed32 | int | uint32 | 如果值总是大于2的28倍,这种类型比昆特32更有效。 |
| fixed64 | long | uint64 | 如果值总是超过56倍,则这种类型比Vint64更有效,如果值总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍 |
| sfixed32 | int | int32 | 总是 4 个字节 |
| sfixed64 | long | int64 | 总是 8 个字节 |
| bool | boolean | bool | |
| string | String | string | 字符串必须是已编码的 UTF-8 或 7 位 ASCII 编码的 。 |
| bytes | ByteString | string | 任何字节序列都可能包括在内。 |
.proto做为文件后缀;message命名使用座头名称,实地命名使用小写字母和下划线分隔符。enum(a) 型号名称用骆驼峰表示,野外名称用大写字母表示,用突出线分隔。service与rpc(a) 方法名称一致使用座头名称;单行注释
多行注释
如果编码电文不包括特定单位元素,解析对象中的相应字段被设定为该字段的默认值,该字段是特定类型:
false;0;信件定义中的每个字段只有一个数字标签。这些标签用于在二进制格式信息中识别字段,一旦使用,就不能修改。
注:
- 编码时, [1, 15] 内的标签使用字节。
- [16,2047] 有一个标签 使用两个字节。
因此,对于经常出现的电文部分,应保留[1、15]中的标签,同时铭记某些标签是为今后可能引入的经常出现的字段保留的。
在.proto文件定义消息,message是.proto由文件最小的逻辑单位序列组成 。name-value键值对构成:
message信件有一个或多个独有编号字段, 每个字段由“ 页面限制 + 字段类型 + 字段名称 + 编号 ” 组成, 字段限制分为“ 页面限制 + 字段类型 + 字段名称 + 编号 ” 。optional(可选,省略)required(必要,省略)repeated(重复的)。
信件可以设置在各种文件中,可以通过import还指定信件用于支持导入时的拼图 。
它可以用来避免两种电文之间的同义词纠纷。package字段声明包名。
在定义信件类型时,您可能需要在预设值序列中指定字段的值。通过在信件定义中插入新项目(在信件定义中),可以指定字段的值(在预设值序列中)。enum并且为每种可想象的价值确定一个常数。
Any类型是一种不需要在.proto文件指定可以直接使用的信件类型。 您必须先导入文件才能使用 :
如果想在RPC在系统中使用信件类型, 必须启用该类型 。.proto文件中定义RPC服务界面, 然后使用编译器生成匹配语言的内存根 。
当我们修改字段时手动删除或加注上一个标签版本时, 旧版本用于装入新版本 。.proto文献资料可能造成重大困难,如数据丢失、侵犯隐私等,防止今后发生这种情况的方法之一是指定要维护的标签。Protocol Buffer如果未来的用户试图使用这些域名标签,汇编者将通知这些用户。
如果当前信件不再满足您的需求, 如添加新字段, 但您仍然想要与上一个版本创建的信件兼容, 您必须安装以下规则来更改信件, 否则将丢失兼容性( 包括一些原版2 的语法函数 ):
optional或者repeated。required字段可以删除,但不能重新使用它们所指的数字标签。required扩展字段可以从字段转换为扩展字段,反之亦然。int32、uint32、int64、uint64和bool这些种类可以共存;sint32和sint64与某些数字类型兼容,但与其它类型不兼容;string和bytes兼容性 只要二进制内容正确UTF-8;optional和repeated兼容性,即指定输入字段为repeated如果受款人预言optional,他选择了原始类型字段的最终值,他合并了信息类型字段的所有输入。proto3语法第一行必须读作:syntax = "proto3";required和optional,所有字段默认是optional类型的;repeated字段默认采用packed编码,在proto2要指定更紧凑的字段,必须明确使用[包装=真 。packed编码方式;Go、Ruby、JavaNano支持;default选项;0;Any类型;JSON映射特性;https://blog.csdn.net/u011518120/article/details/54604615
https://blog.csdn.net/mzpmzk/article/details/80824839
本文由 在线网速测试 整理编辑,转载请注明出处。