protocol buffer使用简介
之前在工作中用到了protocol buffer(此处简称PB)(主要对数据进行序列化与反序列化,方便网络传输中的编解码),之后发现这是一个好东西,在此稍微记录下该工具如何使用,方便以后查阅
官网地址(需 翻 墙):https://developers.google.com/protocol-buffers/docs/downloads
- 准备工作
在工程中使用PB ,首先需要准备好PB运行时库文件(.jar)文件,和PB编译器(protoc.exe,用于自动生成代码)
官网下载下来的PB源文件,需要编译打包成“.jar”文件,这样才能在之后的java工程中调用,此处介绍下打包PB源文件的 过程(解压缩包根目录下README.MD 以及 java/README.MD文件有详细介绍如何下载pb编译器及打包源码过程)
- 官网下载PB源文件和PB编译器程序(源文件和编译器版本必需一致)
- 打包PB源文件生成.jar文件步骤
下载下来的源文件解压后目录结构如下所示 :

将解压得到的PB编译器“protoc.exe”拷贝到上图所示的“src"目录(必需执行该操作,否则之后的mvn操作会失败)
进入上图所示的“java”目录,执行:mvn clean package,编译成功后便可在“target”目录下看见生成的.jar运行库文件。
至此打包生成库文件完成,之后便可调用生成的.jar文件。
protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台,由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域,官网支持java、c++ 和 python,三种语言的实现。
下面介绍一下PB如何使用 :
- 首先 创建扩展名为.proto的文件(一个文件可定义多个message) ,例如 : test.proto
message Login {
required string account = ; //用户名
optional string password = ; //密码,默认没有
optional int32 version = ; //版本号码
required string platform = ; // “brew”
required string device = ; // “HS001C”,后面可能需要区分手持机还是车机
optional string meid = ; // meid字串
optional uint32 expect_payload = [default = ]; //101指AMR,111是EVRC
}
message LoginAck {
required int32 result = ; //-1代表失败,>=0 代表成功
required User usr = ;
required Configure conf = ;
optional ServerInfo tcp_server = ; // TCP 服务器
optional ServerInfo udp_server = ; // UDP 服务器
optional ServerInfo update_server = ; // 升级服务器
optional uint32 cookie = ; //随机种子
}
message QueryGroup {
enum DetailLevel {
ONLY_ID = ;
GROUP_INFO = ;
}
required DetailLevel detail = [default = GROUP_INFO]; //是只返回群组ID还是带群组名称的,默认是带名称的
optional bool include_temp = [default = false]; //是否包括临时群组,默认是不包括的
}
message QueryGroupAck {
required int32 result = ; //-1:fail >=0 succ
repeated Group groups = ;
}


Scalar Value Types
A scalar message field can have one of the following types – the table shows the type specified in the .proto file, and the corresponding type in the automatically generated class:





- 使用protoc.exe(网上可下载)编译器自动生成相应语言的代码
命令行执行 : protoc.exe --java_out=./xxx.jar test.proto
protoc.exe --java_out=./ test.proto

- 使用生成的源码文件或jar文件
- 序列化举例(将上面定义的Login序列化为字节数组) :
Login.Builder builder = Login.newBuilder();
builder.setAccount(userName);
builder.setPlatform("brew");
builder.setDevice("HS001C");
builder.setPassword(pwd);
Login login = builder.build();
byte[] loginBt = login.toByteArray();
- 反序列化举例(将字节数组反序列化为LoginAck对象,方便获取对象中的值):
LoginAck loginAck = LoginAck.parseFrom(byteArray.getArray(byteArray.length() - )); int result = loginAck.getResult();
至此,PB使用基本介绍完成,下面贴出PB官网java 教程 :











protocol buffer使用简介的更多相关文章
- Protocol Buffer使用
Protocol Buffer使用简介 字数2630 阅读5067 评论1 喜欢12 我们项目中使用protocol buffer来进行服务器和客户端的消息交互,服务器使用C++,所以本文主要描述pr ...
- 后端程序员之路 31、Protocol Buffer
google/protobuf: Protocol Buffers - Google's data interchange formathttps://github.com/google/protob ...
- protocol buffer简介
一.protocol buffer简介 protocol buffer(简称PB)是google开源的一个数据序列化与反序列化工具,由于其支持多种语言.各种平台,多被用于对象的存储,远程调用等方向.用 ...
- Google Protocol Buffer 的使用和原理[转]
本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...
- Google Protocol Buffer 的使用
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- Google Protocol Buffer 协议
1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...
- 【Google Protocol Buffer】Google Protocol Buffer
http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...
- iOS 开发之 protocol Buffer 数据交换
前言: 从 14 年公司做项目时开始接触 Google 的 protocol Buffer,用了一段时间,后来到新公司就没有机会再使用了,趁着还没完全忘记,记录下. 简介:protocolbuffer ...
随机推荐
- matlab 全部的随机数函数
matlab 全部的随机数函数 (一)Matlab内部函数 a. 基本随机数 Matlab中有两个最基本生成随机数的函数. 1.rand() 生成(0,1)区间上均匀分布的随机变量.基本语法: ran ...
- 栈和队列的面试题Java实现
栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...
- Eqs (哈希)
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10695 Accepted: 5185 Description Cons ...
- Qt入门(18)——使用信号和槽连接控件
下面显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来. 首先,源文件被我们分成几部分并放在放在t7目录下. t7/lcdrange.h包含LCDRange类定义.t7 ...
- gif动画问题
iOS没有自带支持显示gif动画的功能, 用UIImageView的animationImage虽然可以实现图片动画, 当毕竟不方便. http://blog.stijnspijker.nl/200 ...
- 【转】Usage of sendBroadcast()
原文网址:http://stackoverflow.com/questions/4883079/usage-of-sendbroadcast sendBroadcast() - Should it b ...
- 动态规划(状态压缩):BZOJ 2621 [Usaco2012 Mar]Cows in a Skyscraper
2621: [Usaco2012 Mar]Cows in a Skyscraper Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 303 Sol ...
- eclipse 导入项目时候java版本不一致问题
最近导入一个java项目,发现我安装的java版本是1.8.0_111,而项目的版本是1.8.0_101,当然不想重新再安装旧的java版本,于是就在网上找了解决方法. 在项目的library中右击, ...
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...
- hdoj 2102 A计划
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...