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 ...
随机推荐
- 要开始深入VMM了。
得到一个VMM机器所有的节点状态 Quick one-liner to generate a CSV of virtual machines, sorted by their hosts. Repor ...
- OPENFILER记下,有空再玩之,ISCSI,以后网络起来了,速度还是应该可以的
- Struts2+JFreeChart
前言 关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐: struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0. ...
- InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...
- BZOJ1636: [Usaco2007 Jan]Balanced Lineup
1636: [Usaco2007 Jan]Balanced Lineup Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 476 Solved: 345[ ...
- Bellman-Bord(贝尔曼-福特)
include const int inf=0x3f3f3f3f; int main() { int m,n; scanf("%d%d",&n,&m); int u ...
- Thinkphp分页时查询条件保存方法
web应用中经常要根据用户提交的查询条件进行过滤,再以列表方式显示在浏览器上.如果这种查询是多种条件的组合,并要进行分页显示,则如何在分页导航中保持查询条件,是必须解决的问题. 在Thinkphp中, ...
- Google Guava官方教程(中文版)地址
Google Guava官方教程(中文版) http://ifeve.com/google-guava/ 瓜娃啊瓜娃
- Swift_UILabel
一.初始化 // 初始化UIlabel,并设置frame //let labelOne = UILabel.init(frame: CGRect.init(x: 10, y: 20, width: 3 ...
- centos下的mysql安装
卸载mysql yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mysql rm /etc/my.cnf ...