简介

从第一次接触Protobuf到实际使用已经有半年多,刚开始可能被它的名字所唬住,其实就它是一种轻便高效的数据格式,平台无关、语言无关、可扩展,可用于通讯协议数据存储等领域。

优点

  • 平台无关,语言无关,可扩展;
  • 提供了友好的动态库,使用简单;
  • 解析速度快,比对应的XML快约20-100倍;
  • 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

使用详解

1、服务器安装

安装依赖的库:     autoconf automake libtool curl make g++ unzip

安装:

 $ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install

2、 安卓客户端安卓

下载相应版本jar包即可。(csdn上上传了nano版本的jar包和exe文件)

3、 项目实战

首先举一个服务端和客户端按照Protobuf协议进行数据数据传输的例子,工作流程如下图:(图下方深色部分为服务端部分,上方浅色部分为客户端部分)

1、服务端和客户端约定他们使用PB协议作为数据传输和存储的工具,并约定传输信息的字段,如下:里面定义支付传输的字段。

 syntax = "proto2";          // PB协议版本
import "Common.proto"; // 引入Common.proto,位于Protobuf sdk中 option optimize_for = LITE_RUNTIME; option java_package = "com.xxxx.entity.pb"; // 生成类的包名
option java_outer_classname = "PayInfo"; // 生成类的类名 message PayInfo{
required string payid = 1; // 支付相关的字段信息
optional string goodinfo = 2; // optional 为可选参数
required string prepayid = 3; // required为必填参数
optional string mode = 4;
optional int userid = 5;
repeated string extra = 6; // repeated 为数组
}

2、通过Protobuf源码编译得到可运行程序(也可以在网上查找下载,注意PB协议的版本)。得到exe程序中,在windows环境下通过命令行窗口命令生成上述文件中定义的PayInfo.java文件。(protoc 为可执行的exe文件)

 protoc --java_out ./ ./PayInfo.proto

3、将生成PayInfo文件集成到项目代码中,同时需要引入 ProtoBuf的sdk(因为生成的PayInfo.Java类中引入了sdk中的类),可以在github上下载:https://github.com/google/protobuf

4、服务端通过支付信息初始化PayInfo类,并调用ProtoBufSDK中 com.google.protobuf.nano 类的 toByteArray()方法将PayInfo转化为字节数组,通过网络传输给客户端(可以进行加密和压缩操作,注意顺序)。

 public static final byte[] toByteArray(MessageNano msg) {
byte[] result = new byte[msg.getSerializedSize()];
toByteArray(msg, result, 0, result.length);
return result;
}

5、客户端拿到字节数据后,通过集成的PayInfo.java文件对字节数据解析成PayInfo对象(通过程序生成的java文件都会自动生成这个函数)。

 public static PayInfo parseFrom(byte[] data)

自此:客户端就顺利拿到了服务端发送的支付信息,可以通过他们调起支付宝或者微信客户端发起支付了。

由此可以看出ProtoBuf只是一种协议,一种存储数据的格式,对应上面生成的字节数据的格式,任何语言的程序都可以通过本地类和jar包将字节数据解析成对象(语言/平台无关)。

使用建议:

1、通过编译程序生成.java文件有不同的版本,建议使用nano版本(3.0之后的PB协议才发布该版本),这种版本生成的java文件方法数较少(没有set,get等函数),对APK的体积影响更小(四五个文件大前后相差80~90Kb,项目中后续作了替换)。命令:

 protoc_3.1.0.exe  --javanano_out ./ ./GetConfig.proto

2、不管用2.0还是3.0还是nano版本还是非精简版最终生成的字节数据文件是相同的,不影响前后端的交互。

与其它数据协议比较

Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

和其它数据协议的比较如下图:

为什么Protobuf作为数据传输协议如此高效?

1. 数据小:

  a) 同json相比较,它不需要传递key值,而是用第几个元素成员变量来表示(而且index使用varient来存储,只占用一个字节)。

  b) 它还会开辟一个字节存放 该字符串的长度,用于直接查找字符串。

  c) 不需要传输','/‘:’等不必要的分隔符,存储没有浪费。

  其存储格式如下:

2. 解析速度快:

json解析成对象的话,需要将每个成员变量的key值到整个json串中匹配查找key。而在protobuf中直接通过比较tag序列就可以了,而且值的获取也可以直接通过legth获取,所以解析速度非常快。

参考:

https://developers.google.com/protocol-buffers/

https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

https://tech.meituan.com/serialization_vs_deserialization.html

Protobuf 从入门到实战的更多相关文章

  1. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  2. 赞一个 kindle电子书有最新的计算机图书可买了【Docker技术入门与实战】

    最近对docker这个比较感兴趣,找一个比较完整的书籍看看,在z.cn上找到了电子书,jd dangdang看来要加油啊 Docker技术入门与实战 [Kindle电子书] ~ 杨保华 戴王剑 曹亚仑 ...

  3. docker-9 supervisord 参考docker从入门到实战

    参考docker从入门到实战 使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机 ...

  4. webpack入门和实战(一):webpack配置及技巧

    一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...

  5. CMake快速入门教程-实战

    http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...

  6. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  7. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用

    该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...

  8. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  9. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

随机推荐

  1. [转载]linux修改open files数

    概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...

  2. 使用GPA针对android应用的绘制分析

    使用GPA针对android应用的绘制分析 以前经常用GPA来perf端游的绘制,很多perf工具例如perfhud,pix对于加壳的程序总是束手无策,但是GPA却不受这个限制,可以自动HOOK 3D ...

  3. Windows下安装Selenium

    安装python,建议在官网下载python3以上的版本 安装easy_install,找度娘 安装selenium,在命令行窗口下输入:pip install -U selenium 下载chrom ...

  4. 多个tab选项卡

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. AOP及spring AOP的使用

    介绍 AOP是一种概念(思想),并没有设定具体语言的实现. AOP是对oop的一种补充,不是取而代之. 具体思想:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. 特征 散布于应 ...

  6. Nginx常用配置实例(4)

    Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx常用的配置实例,具体包含虚拟主机配 ...

  7. 整理C++面试题for非CS程序猿——更新至【48】

    结合网上的C++面试题+自己的面经,进行整理记录,for我这种非CS的程序猿.(不定期更新,加入了自己的理解,如有不对,请指出) [1] new/delete和malloc/free的区别和联系? 1 ...

  8. struts2(六)之ognl表达式与ActionContext、ValueStack

    前言 前面已经把struts2讲内容说了一半了,我写的很详细,希望对博友们有帮助. 一.OGNL表达式语言概述 1.1.OGNL表达式简介 百度上是这样说: OGNL是Object-Graph Nav ...

  9. [bzoj2836] 魔法树

    俩操作:增加路径上的点的权值.查询子树的权值和. 想了想似乎只能树链剖分了..好久没写链剖+数据结构了TAT 一开始没开LL炸了一发(明明有想到的..我果然是傻逼= = #include<cst ...

  10. c++(线性堆栈)

    前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈.堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计.那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面: ...