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 ...
随机推荐
- 8个经典的HTML5游戏在线试玩及源码学习
原文地址:http://www.oschina.net/news/32364/html5-games 游戏,毫无疑问是拿来供大家娱乐玩耍的,这也无可厚非,但是,今天给大家分享的8个HTML5游戏,在好 ...
- BZOJ 3575 道路堵塞
Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从 ...
- Winform 隐藏程序窗口
internal class HideOnStartupApplicationContext : ApplicationContext { private Form mainFormInternal; ...
- 自己动手实现Queue
前言: 看到许多面经说,有时候面试官要你自己当场用模板写出自己的vector容器.于是,我也琢磨着怎么自己动手写一个,可是本人才刚刚学C++模板编程不久,会的不多.不过,我恰好在C++ Primer上 ...
- 汇编学习笔记(7)call和ret指令
ret和retf CPU执行ret指令时进行以下两步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 这相当于pop IP CPU执行retf指令时进行以下四步操作: (IP)= ...
- android实现图片识别的几种方法
实现android图像识别的几种方法 点击这里下载第一种代码 最近完成了毕业设计,论文名为基于图像识别的移动人口管理系统.编写过程中学到了几种图像识别的技术,先写下来与大家分享. 第一种,直接使用免费 ...
- linux下挂载另一系统硬盘。
问题描述: Error mounting /dev/sda5 at /media/wangzheng/办公: Command-line `mount -t "ntfs" -o &q ...
- 数据结构——foodfill 八连块问题
Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...
- TabHost结合RadioButton实现主页的导航效果
布局文件的设置,如下 <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:androi ...
- bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2813 Solved: 1331[Submit][ ...