基本概念

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. PCA和LDA降维的比较

    PCA 主成分分析方法,LDA 线性判别分析方法,可以认为是有监督的数据降维.下面的代码分别实现了两种降维方式: print(__doc__) import matplotlib.pyplot as ...

  2. silverlight ListBox 多列图片效果

    这个功能之前用wpf写过一次这次用Silverlight写一次 这两种写法上基本上没有太大的差别 这个Demo并不完美,只是给大家提供一个思路 源码:SilverLightListPricture.r ...

  3. 编写高质量代码改善C#程序的157个建议[动态数组、循环遍历、对象集合初始化]

    前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...

  4. Linq之Linq to Objects

    目录 写在前面 系列文章 linq to objects 总结 写在前面 上篇文章介绍了linq的延迟加载特性的相关内容,从这篇文章开始将陆续介绍linq to Objects,linq to xml ...

  5. Intellij idea安装设置

  6. “耐撕”团队2016.03.28 站立会议

    1. 时间:20:30--20:50 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.c ...

  7. jsp+oracle实现数据库内容以表格形式在前台显示(包含分页)

    jsp+oracle实现数据库内容以表格形式在前台显示(包含分页) 在文件夹内新增list_emp.jsp 代码如下: <%@ page contentType="text/html& ...

  8. 5.9-3 用正则表达式判断字符串text是否为合法的手机号

    package zfc; public class Zfc { public static void main(String[] args) { //判断手机号格式是否合法 String text = ...

  9. Linq 分页不可缺少的两个方法

    //LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCou ...

  10. Oracle中的伪列

    分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where ...