基本概念

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介绍的更多相关文章

  1. Protocol Buffers介绍及例子

    Protocol Buffers介绍及例子 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或数据交换格式.可用于通讯协 ...

  2. Protocol buffers 介绍

    Protocol buffers和mxl一样在序列化数据结构时很灵活.高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单.目前protocol buffers支持C++.java和p ...

  3. 开源点评:Protocol Buffers介绍

    今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...

  4. Google Protocol Buffers介绍

    简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...

  5. java&Protocol Buffers

    ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 P ...

  6. Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南

    Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...

  7. Protocol Buffers(Protobuf)开发者指南---概览

    Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...

  8. 使用 Protocol Buffers 代替 JSON 的五个原因

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. Protocol Buffers编码详解,例子,图解

    Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力 ...

随机推荐

  1. fis-receiver:一行命令将项目部署到远程服务器

    前言 本项目基于FIS2,没了.其实fis项目本身就提供了php版本的范例,这里翻译成node版本. 项目地址:https://github.com/chyingp/fis-receiver 服务端接 ...

  2. CocoaPods Podfile 文件写法有讲究

    最近做到一些项目想到用 OC/Swift混编的问题.为了搞懂 bridge header 这个文件是咋个情况.却一致报错.最后不知不觉发现问题问题居然出在 Podfile 上. 开始我是从 IT 江湖 ...

  3. ios上uiwebview的一些实用技巧

    前几个星期接到公司一个项目,要用webview在客户端上播视频,作为一个前端实习生,这种需求真是蛋疼……一不知webview是何方神圣,二不知咋调试…… 下面就是蛋疼的开始:  寻找调试工具:好,非w ...

  4. 关于hangfire的使用

    hangfire 是一个分布式后台执行服务.用它可以代替ThreadPool.QueunItemWork等原生方法.当然4.5后的 task也是相当好用且功能强大.不过如果想分布式处理并且可监控的话, ...

  5. js的__proto__与propertype的关系

    经典的再也不能经典的一篇博客:http://www.cnblogs.com/snandy/archive/2012/09/01/2664134.html js中最propertype的一些方法的理解h ...

  6. 每天一个linux命令(51):rcp命令

    rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝到另一个目录中. 1 ...

  7. 3.3.1实现Servlet

    FirstServlet.java package com.helloweenvsfei.servlet; import java.io.IOException; import java.io.Pri ...

  8. hdu2222 字典树

    要注意二点 . 这组数据 1 6 she he he say shr her yasherhs出现重复的,也要算.所以这里答案为4: 这一组 1 6 she he he say shr her yas ...

  9. Js-字符转换数字

    s 字符串转化成数字 的 三种方法主要有 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数, ...

  10. Lucene 4.7 --创建索引

    Lucene的最新版本和以前的语法或者类名,类规定都相差甚远 0.准备工作: 1). Lucene官方API http://lucene.apache.org/core/4_7_0/index.htm ...