protobuf从入门到实战(代码片段)

garfielder007 garfielder007     2023-02-02     683

关键词:

简介

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

 

优点

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

使用详解

1、服务器安装

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

安装:

  1 $ ./autogen.sh
  2 $ ./configure
  3 $ make
  4 $ make check
  5 $ sudo make install

2、 安卓客户端安卓

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

3、 项目实战

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

 

技术分享图片

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

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

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

  1 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转化为字节数组,通过网络传输给客户端(可以进行加密和压缩操作,注意顺序)。

  1 public static final byte[] toByteArray(MessageNano msg) 
  2         byte[] result = new byte[msg.getSerializedSize()];
  3         toByteArray(msg, result, 0, result.length);
  4         return result;
  5     

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

  1 public static PayInfo parseFrom(byte[] data)

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

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

使用建议:

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

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

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

与其它数据协议比较

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

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

技术分享图片

总结

        作为开发者使用protobuf简单高效,至于里面具体如何实现深层次的东西我们还不如花点时间学一下数据结构。

参考:

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

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

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

from: http://www.cnblogs.com/NeilZhang/p/8410589.html

protobuf从入门到实战

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

protobuf从入门到“顺手”(代码片段)

...3.1.json与message转换4.更多详情和大神帖参考很多项目采用Protobuf进行消息的通讯,还有基于Protobuf的微服务框 查看详情

protobuf从入门到“顺手”(代码片段)

...3.1.json与message转换4.更多详情和大神帖参考很多项目采用Protobuf进行消息的通讯,还有基于Protobuf的微服务框 查看详情

websocket从入门到实战(代码片段)

文章目录WebSocketWebSocket介绍WebSocketAPIWebSocket对象WebSocket属性WebSocket事件:WebSocket方法:WebSocket实例客户端服务端代码链接WebSocket应用场景WebSocketWebSocket介绍WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双向通讯的协... 查看详情

elasticsearchcurator从入门到实战(代码片段)

1.概述转载:Curator从入门到实战Curator是elasticsearch官方的一个索引管理工具,可以通过配置文件的方式帮助我们对指定的一批索引进行创建/删除、打开/关闭、快照/恢复等管理操作。2.场景比如,出于读写性能的考虑&#... 查看详情

01如何学习pythonweb开发从入门到实战(代码片段)

PythonWeb开发从入门到实战前言:PythonWeb是学校所学的课程,我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程,更多还是让自己在课程结束之后进行一个小的总结... 查看详情

01如何学习pythonweb开发从入门到实战(代码片段)

PythonWeb开发从入门到实战前言:PythonWeb是学校所学的课程,我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程,更多还是让自己在课程结束之后进行一个小的总结... 查看详情

sqoop从入门到实战(代码片段)

第1章Sqoop简介  Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql,postgresql,...)间进行数据的高校传递,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数... 查看详情

flink流式计算从入门到实战二(代码片段)

文章目录三、Flink运行架构1、JobManager和TaskManager2、并发度与Slots3、开发环境搭建4、提交到集群执行5、并行度分析6、Flink整体运行流程Flink流式计算实战专题二==楼兰三、Flink运行架构这一章重点是分析清楚运行架构以及并... 查看详情

hive从入门到实战一(代码片段)

第1章Hive入门1.1什么是Hive  Hive:由Facebook开源用于解决海量结构化日志的数据统计(分析数据的框架)。  Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 &e... 查看详情

flume从入门到实战(代码片段)

第1章Flume概述1.1Flume定义  Flume(水槽)是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。  在2009年Flume被捐赠了apache软件基金会,为hadoop相关组件... 查看详情

hive从入门到实战二(代码片段)

第4章DDL数据定义4.1创建数据库1)创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db。hive (default)> create database db_hive;2)避免要创建的数据库已经存在错误,增加ifnotexists判断。(标准写法)hi... 查看详情

azkaban从入门到实战(代码片段)

一概述1.1为什么需要工作流调度系统1)一个完整的数据分析系统通常都是由大量任务单元组成:  shell脚本程序,java程序,mapreduce程序、hive脚本等。2)各任务单元之间存在时间先后及前后依赖关系。3)为了很好地组织... 查看详情

flink流式计算从入门到实战三(代码片段)

文章目录四、FlinkDataStreamAPI1、Flink程序的基础运行模型2、Environment运行环境3、Source3.1基于File的数据源3.2基于Socket的数据源3.3基于集合的数据源3.4从Kafka读取数据3.5自定义Source4、Sink4.1输出到到控制台4.2输出到文件4.3输出到Socket4.4... 查看详情

kafka从入门到实战(代码片段)

第1章Kafka概述1.1消息队列1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)  点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这... 查看详情

shell脚本从入门到实战(代码片段)

Shell文章目录Shellshell概述Shell脚本入门1.脚本格式2.第一个Shell脚本:helloworld3.第二个Shell脚本:多命令处理Shell中的变量系统变量1.常用系统变量2.案例实操自定义变量1.基本语法2.变量定义规则特殊变量:$n特殊变量:$#... 查看详情

protobuf从入门到“顺手”(代码片段)

...3.1.json与message转换4.更多详情和大神帖参考很多项目采用Protobuf进行消息的通讯,还有基于Protobuf的微服务框架GRPC,最近在使用一些框架的时候,顺手梳理了一下protobuf的一些语言特性和一些实用技巧。全文基于最新pro... 查看详情

pandas从入门到实战(day1)(代码片段)

PandasPandas读取数据&pandas数据结构数据的读取读取csv文件读取txt文件读取excel文件读取sqlPandas数据结构(DataFrame&Seires)Seires创建SeiresDataFrame创建DataFrame从DataFrame查询出Seires取出一列/多列取出一行/多行数据的读取数据... 查看详情