protocal buffer repeate 关键字
转自:http://blog.csdn.net/guyue35/article/details/51181845
http://blog.sina.com.cn/s/blog_abea023b0101dxce.html
要通信,必须有协议,否则双方无法理解对方的码流。在protobuf中,协议是由一系列的消息组成的。因此最重要的就是定义通信时使用到的消息格式。
Protobuf消息定义
消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。
字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]
①.限定修饰符包含 required\optional\repeated
Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。
Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。
Repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。
②.数据类型
Protobuf定义了一套基本数据类型。几乎都可以映射到C++\Java等语言的基础数据类型.
protobuf 数据类型 |
描述 |
打包 |
C++语言映射 |
bool |
布尔类型 |
1字节 |
bool |
double |
64位浮点数 |
N |
double |
float |
32为浮点数 |
N |
float |
int32 |
32位整数、 |
N |
int |
uin32 |
无符号32位整数 |
N |
unsigned int |
int64 |
64位整数 |
N |
__int64 |
uint64 |
64为无符号整 |
N |
unsigned __int64 |
sint32 |
32位整数,处理负数效率更高 |
N |
int32 |
sing64 |
64位整数 处理负数效率更高 |
N |
__int64 |
fixed32 |
32位无符号整数 |
4 |
unsigned int32 |
fixed64 |
64位无符号整数 |
8 |
unsigned __int64 |
sfixed32 |
32位整数、能以更高的效率处理负数 |
4 |
unsigned int32 |
sfixed64 |
64为整数 |
8 |
unsigned __int64 |
string |
只能处理 ASCII字符 |
N |
std::string |
bytes |
用于处理多字节的语言字符、如中文 |
N |
std::string |
enum |
可以包含一个用户自定义的枚举类型uint32 |
N(uint32) |
enum |
message |
可以包含一个用户自定义的消息类型 |
N |
object of class |
N 表示打包的字节并不是固定。而是根据数据的大小或者长度。
例如int32,如果数值比较小,在0~127时,使用一个字节打包。
关于枚举的打包方式和uint32相同。
关于message,类似于c语言中的结构包含另外一个结构作为数据成员一样。
关于 fixed32 和int32的区别。fixed32的打包效率比int32的效率高,但是使用的空间一般比int32多。因此一个属于时间效率高,一个属于空间效率高。根据项目的实际情况,一般选择fixed32,如果遇到对传输数据量要求比较苛刻的环境,可以选择int32.
③.字段名称
字段名称的命名与C、C++、Java等语言的变量命名方式几乎是相同的。
protobuf建议字段的命名采用以下划线分割的驼峰式。例如 first_name 而不是firstName.
④.字段编码值
有了该值,通信双方才能互相识别对方的字段。当然相同的编码值,其限定修饰符和数据类型必须相同。
编码值的取值范围为 1~2^32(4294967296)。
其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16.
1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。
protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值。
消息中的字段的编码值无需连续,只要是合法的,并且不能在同一个消息中有字段包含相同的编码值。
建议:项目投入运营以后涉及到版本升级时的新增消息字段全部使用optional或者repeated,尽量不实用required。如果使用了required,需要全网统一升级,如果使用optional或者repeated可以平滑升级。
⑤.默认值。当在传递数据时,对于required数据类型,如果用户没有设置值,则使用默认值传递到对端。当接受数据是,对于optional字段,如果没有接收到optional字段,则设置为默认值。
关于import
protobuf 接口文件可以像C语言的h文件一个,分离为多个,在需要的时候通过 import导入需要对文件。其行为和C语言的#include或者java的import的行为大致相同。
关于package
避免名称冲突,可以给每个文件指定一个package名称,对于java解析为java中的包。对于C++则解析为名称空间。
关于message
支持嵌套消息,消息可以包含另一个消息作为其字段。也可以在消息内定义一个新的消息。
关于enum
枚举的定义和C++相同,但是有一些限制。
枚举值必须大于等于0的整数。
使用分号(;)分隔枚举变量而不是C++语言中的逗号(,)
eg.
enum VoipProtocol
{
H323 = 1;
SIP = 2;
MGCP = 3;
H248 = 4;
}
protocal buffer repeate 关键字相关推荐
- Mac 下使用 VS Code 生成 C++ 的 Google Protocal Buffer 项目及使用记录
Mac下Protobuf编译及使用记录 前言 信息传输格式,相比于xml和json的纯文本格式,protocal是经过序列化的,显然空间占用更小,但也导致了读取比较复杂. 正常读取需要protobuf ...
- protocal buffers 官方文档学习
protocal buffers 官方文档学习 文章目录 protocal buffers 官方文档学习 1.What are protocol buffers? 2.选择你喜欢的语言 3.怎么开始, ...
- QT在使用protocal的问题解决记录之std :: string和QByteArray之间的无损转换
服务器端使用的是skynet+lua,lua版本是5.3.5,pbc库是前面的教程中编译的. 客户端使用是C++版本的protobuf,也是教程里编译的. 客户端使用的是Qt库QTcpSocket收网 ...
- google的protocal buffers(proto2)之(一)
Protocol Buffers 是一种序列化数据结构的方法.对于通过导线或存储数据进行通信的程序开发上是很有用的.这个方法包含一个接口描述语言,描述一些数据结构,并且提供程序工具根据这些描述产生代码 ...
- Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用
在这里汇总一下:thrift版本差异和源码及jar包下载.文档,示例(脚本.代码.),白皮书,常见问题. 有很内容是重复的,给位看官自行过滤. 英文资料 API 使用介绍 原理简介(推荐阅读) 和 简 ...
- 这篇文章,专治MQ中间件各种疑难杂症
点击▲关注 "数据和云" 给公众号标星置顶 更多精彩 第一时间直达 " 今天这篇文章为大家总结下 MQ 应用中的一些疑难杂症. 消息队列有什么优点和缺点? 为什么使用 ...
- 【RPC】序列化与反序列化
文章目录 1. 基本概念? 2. 文本格式的序列化方案 2.1 XML格式 2.2 JSON格式 3. 二进制格式的序列化方法 4. 序列化框架选型 1. 基本概念? 序列化和反序列化是一种数据转化的 ...
- protobuf详细介绍和使用
一.protobuf初识 (一)protocol buffers 是什么? protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小.更 ...
- proto3 协议指引
一.protocal buffer 是什么? 一种序列化机制. 什么是序列化? 一种转化为可存储和传输对象的过程. 序列化的方式有很多,那么proto有什么特殊的呢? 它的英文介绍里提到了neutra ...
- Thrift使用指南及语法介绍
Thrift使用指南及语法介绍 1. 数据类型(Types) 基本类型(Basic types) 容器(Containers) 结构体和异常(Structs and Exceptions) 服务(Se ...
最新文章
- P1791-[国家集训队]人员雇佣【最大权闭合图】
- 364. Nested List Weight SumII
- docker 完成 redis集群搭建
- 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本
- Object类中的toString方法
- c语言如何调用外部文件的函数调用,keil 中如何调用其他文件的函数
- [ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)
- OpenCV-向上采样cv::pyrUp向下采样cv::pyrDown
- Android开发之在不同API上遇见的坑
- java下载文件excel格式错乱,excel表格数据错乱如何修复-excel表格里的文件突然格式全部乱了,怎么恢复?...
- Python下载和安装图文教程[超详细]
- assignment to ‘float *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]指针类型错
- 查看计算机温度指令,如何查看电脑CPU的温度?查看CPU温度的两种方法
- 关于股票的经典书籍有哪些推荐?
- DNX451 与 DNXCORE50 获取当前应用程序目录
- 智能家居系列之智能家居平台设计
- Java中Switch选择语句的用法
- jquery仿直播app按钮点赞特效
- 宽带服务器无响应678,宽带连接错误678解决方法
- 8种方法突破iGuard网页防篡改软件保护
热门文章
- NETBEAN 启动报错 CANNOT LOCATE JAVA INSTALLATION IN SPECIFIED JDKHOME的解决办法
- 免费的SQL Server监控工具
- 因文件包含病毒或潜在的垃圾软件导致被防火墙拦截的解决方法
- linux su文件删除了,UBUNTU linux 批量删除文件
- markdown 在线解析 工具
- 在RedHat Linux下安装惠普磁带机(转)
- TPC_mcgs打印方案
- 网络工程师/技术支持工程师面试题(1)
- Java将byte流转换成zip文件_java zip文件的压缩与解压
- 数据库SQL语句总结大全