之前在工作中用到了protocol buffer(此处简称PB)(主要对数据进行序列化与反序列化,方便网络传输中的编解码),之后发现这是一个好东西,在此稍微记录下该工具如何使用,方便以后查阅
官网地址(需 翻 墙):https://developers.google.com/protocol-buffers/docs/downloads
- 准备工作
在工程中使用PB ,首先需要准备好PB运行时库文件(.jar)文件,和PB编译器(protoc.exe,用于自动生成代码)
官网下载下来的PB源文件,需要编译打包成“.jar”文件,这样才能在之后的java工程中调用,此处介绍下打包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 = 1; //用户名 optional string password = 2; //密码,默认没有 optional int32 version = 3; //版本号码 required string platform = 4; // “brew” required string device = 5; // “HS001C”,后面可能需要区分手持机还是车机 optional string meid = 6; // meid字串 optional uint32 expect_payload = 7 [default = 101]; //101指AMR,111是EVRC } message LoginAck { required int32 result = 1; //-1代表失败,>=0 代表成功 required User usr = 2; required Configure conf = 3; optional ServerInfo tcp_server = 4; // TCP 服务器 optional ServerInfo udp_server = 5; // UDP 服务器 optional ServerInfo update_server = 6; // 升级服务器 optional uint32 cookie = 7; //随机种子 } message QueryGroup { enum DetailLevel { ONLY_ID = 0; GROUP_INFO = 1; } required DetailLevel detail = 1 [default = GROUP_INFO]; //是只返回群组ID还是带群组名称的,默认是带名称的 optional bool include_temp = 2 [default = false]; //是否包括临时群组,默认是不包括的 } message QueryGroupAck { required int32 result = 1; //-1:fail >=0 succ repeated Group groups = 2; }
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() - 3)); int result = loginAck.getResult();
至此,PB使用基本介绍完成,下面贴出PB官网java 教程 :