基本概念

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. css3动画 bug 2点

    1. .myanimate{ transition-property: left;transition-duration: .3s;transition-timing-function: ease } ...

  2. Orchard 刨析:Logging

    最近事情比较多,有预研的,有目前正在研发的,都是很需要时间的工作,所以导致这周只写了两篇Orchard系列的文章,这边不能保证后期会很频繁的更新该系列,但我会写完这整个系列,包括后面会把正在研发的东西 ...

  3. 使用Web Deploy进行远程部署

    Web Deploy支持直接从本地Visual Studio的工程文件部署网站到远程服务器,部署的过程中可以对比哪些文件变化了需要拷贝,而不是一股脑的全部拷贝,效率和准确性会更好. 部署的过程主要要注 ...

  4. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  5. Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则

    一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以 Controller名命名的文件夹下.如果我们写到别处呢?那么 ...

  6. codevs1500 后缀排序

    题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...

  7. TCP/IP详解 学习七

    静态选路的前提: 1)         网络比较小 2)         网络之间单点连接 3)         网络之间没有多余的路由 动态选路协议,用于路由器之间的通信,有以下几种: 1)     ...

  8. getchar() 和 scanf("%c")的区别

    getchar()和scanf("%c")的功能都是从STDIN读一个字符,单论功能两者没有区别. 但两者的返回值是有区别的: -------------------------- ...

  9. codeforce626D (概率)

    D. Jerry's Protest time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. eclipse中文乱码问题解决方案

    eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工程时,如果该工程的编码方式与eclipse中设置的编码方式不同 ...