Protocol Buffers介绍
基本概念
Protocol Buffers(以下简称PB)是一种独立于语言、独立于开发平台、可扩展的序列化数据结构框架,它常常被用在通信、数据序列化保存等方面。
PB是一种敏捷、高效、自动化的用于对数据进行序列化的框架。同XML比较,比XML更小、更快、更简单。你一旦定义了期望的数据结构,就可以根据定义生成特定的源码,从而轻而易举地对你的数据进行读写操作,你甚至可以在不修改原来的程序源码的情况下,更新自己的之前定义的数据结构。
PB与其他协议的比较
语言:
PB与Json都是跨语言的,PB支持C++、Java、Python等语言;
Json支持的语言比PB更多,类似Json结构;
XML结构支持的语言也是要比PB更多。
结构:
PB发送与接受的数据属于一个完整的对象;
Json发送与接受的是一个键值对的数据结构;
XML结构从本质上讲也是一种键值对的数据结构。
数据保存:
PB是二进制方式方式保存;
Json属于文本保存;
XML保存的是文本
(说明:文本的话更容易被破解,如果要在网络传输中使用,后面两种我们就得自己去实现加密算法来保证数据在网络中的安全性了,当然,并不是说PB的二进制就完全没法破解,只是较之其他两种结构来说安全一点)。
开发和扩展成本:
PB只要维护一份proto文件就可以直接生成特定语言的类,保证了开发的高效,降低了维护成本;
Json协议一般需要发送与接受方事先定义好结构,同时因为Json协议解析的时候是大小写敏感的,使得开发和维护成本较之PB略高;
XML结构一般来说组织和解析都是需要开发人员自己去实现,开发成本和维护成本比PB和Json更高;
适用范围:
PB和Json一般大都使用在客户端与服务器通信模块,主要是因为数据的组织和解析较为简单;
而XML结构一般是作为配置文件来使用,主要是因为方便属性的配置和修改。
通过下面的表格我们可以更清楚这三种结构之间的关系:
|
协议 |
语言 |
结构 |
数据保存 |
开发成本 |
数据大小 |
适用范围 |
|
PB |
C++/Java/Python |
对象 |
二进制文件 |
低 |
小 |
C/S通信 |
|
Json |
多种 |
键值对 |
文本 |
较低 |
一般 |
C/S通信 |
|
XML |
多种 |
键值对 |
文本 |
高 |
大 |
配置文件 |
表 1
PB的使用过程
1、定义自己的数据结构
PB允许我们定义自己期望的数据结构Message,它的定义是通过.proto文件来实现的。每个Message都是一个信息的逻辑记录块,这个块包括了一系列键对值(“键”相当于生成对应类文件的属性名,“值”表示这个属性的权限)
这里是作者自己写的一个.proto文件。
图 1
如图1前两行分别定义了java包名和类名,在这个结构中,作者定义了一个WorkerInfoList,这就相当于一个员工的信息列表,每个员工信息定义在Work中,其中包括了员工号(id)、员工姓名(name)、员工邮箱(email)、员工地址(address)等信息。这样我们就完成了一个PB的模板(.proto文件)。
这里需要说明的是模板定义中使用的三种不同的属性optional、required以及repeated。
Optional属性说明该属性是可选的,就是说在组织数据包时,这个数据项可以是可有可无的。
Required属性说明该属性是必须有值的,不可为空。
Repeated属性说明该属性是一个列表,我们可以把这种数据项理解为一个list来使用。
2、生成对应语言的源码;
有了模板这是第一步,接下来就要通过这个模板去生成对应语言下的类文件,google为我们提供了生成工具(protoc.exe,很多地方都可以下载到),作者是从https://developers.google.com/protocol-buffers/这里下载了(作者在使用的时候,ProtocolBuf最新版本是2.4.1)。
下载完成打开之后我们可以看到如下图2的目录结构:
图 2
其中protoc工程编译之后就可以得到我们需要的protoc.exe工具。
在cmd中启动protoc并给定参数就可以生成我们需要的C、Java、Python的类文件。这里,作者简单对protoc生成对应文件的参数做一说明:
--proto_path参数是指定我们的proto模板的目录(不要定义成这个模板文件,否则会报“Not find file”的错误);
第二个参数取决于我们想生成的文件类型,如果想生成C++的类参数名是“—cpp_out”;如果想生成Java的类参数名是“—java_out”;同理,如果想生成Python类,参数名就是“—python_out”。
接下来我们通过上面定义的模板来生成对应的类文件:
C++:
图 3
Java:
图 4
Python:
图 5
生成结果如下所示:
C++类文件:
图 6
Java类文件:
图 7
Python类文件:
图 8
这里需要单独说明一下的是Java类文件生成的时候会出现多级目录,这个前面已经说过,每一层的目录是我们在模板中定义的。
3、使用
有了类文件,我们就可以通过对应的API去组织和解析对应的数据了。这里简单说一下C++中的类调用(Java和Python中的使用可以自己去查看)。
图 9
如图9是上面的模板中Worker类的id调用接口。id返回数据值,set_id设置数据值这些接口基本都可以通过名字知道其含义。
图 10
图10中,是WorkInfoList的接口,因为这个类中包含了一个Worker的repeated数据项,前面说过我们可以把它当做一个list来使用,即在组织数据的时候通过add_workerinfo来添加一项员工数据,这个接口返回其指针,通过mutable_workerinfo(int index)接口来获取下标为index的数据指针并进行操作(设置数据等);在解析其参数的时候通过workinfo(int index)来获取下标为index的数据等等。具体的我们可以在真正使用的时候去进一步熟悉掌握。
Protocol Buffers介绍的更多相关文章
- Protocol Buffers介绍及例子
Protocol Buffers介绍及例子 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或数据交换格式.可用于通讯协 ...
- Protocol buffers 介绍
Protocol buffers和mxl一样在序列化数据结构时很灵活.高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单.目前protocol buffers支持C++.java和p ...
- 开源点评:Protocol Buffers介绍
今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...
- Google Protocol Buffers介绍
简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...
- java&Protocol Buffers
ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 P ...
- Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南
Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...
- Protocol Buffers(Protobuf)开发者指南---概览
Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...
- 使用 Protocol Buffers 代替 JSON 的五个原因
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Protocol Buffers编码详解,例子,图解
Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力 ...
随机推荐
- 扫描函数sweep
groot.sweep(element,vm); element 为要扫描的代码片段,vm 对应的一个 groot.view 定义的 一个Vm的整体 扫面代码 groot.sweep = functi ...
- Android学习第六弹之Touch事件的处理
在移动开发过程当中,我们经常会遇到手势处理和事件触摸的情况,如果不了解整个事件的处理机制,对于开发的同学和码农是非常痛苦的,但是事件触摸的处理确实是一个非常复杂的过程,细讲起来,估计我都能讲迷糊,这里 ...
- NABCD分析java音乐播放器
程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计 ...
- 利用less监视模式实时预览样式刷新浏览器
[前言]此处介绍的方法只是我个人的用法,相信大家有更好更简洁的方式. 上次写到利用LiveReload解放F5.而且LiveReload可以编辑sass/less/stylus.但是可惜发现LiveR ...
- IntelliJ IDEA 设置 编辑器字体大小
1,打开File->settings 2,在Edit->colors->Fonts下创建新字体 保存即可.
- BZOJ-3282 Tree Link-Cut-Tree(似乎树链剖分亦可)
蛋蛋用链剖A的,我写的LCT 3282: Tree Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1241 Solved: 542 [Submit][ ...
- JSON前端页面解析
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更 ...
- Java线程之间通信
用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...
- JDK,JRE,JVM区别与联系(ZZ)
http://www.cnblogs.com/hencehong/p/3252166.html 我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JD ...
- linux下svn命令大全
linux下svn命令大全 1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/p ...