什么是Protocol Buffer?
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
IBM上面copy的
Protocol Buffer版本
protobuf 目前有两个版本,分别是proto2和proto3,鉴于proto3还是beta
版本,所以本人还是使用proto2
优点
序列化速度快,官方说比xml和json快20~100倍
体积小,有测试表明数据可以缩小3倍左右
多平台仅需维护一套对象协议文件(.proto)
使用在http里面,传输内容抓包只能看到的是字节
因为体积小,传输起来带宽和速度会有优化
安装
1、首先,下载 Protocol Buffer v2.6.1
,然后进行解压,我是选择protobuf-2.6.1.tar.gz
2、解压后,运行autogen.sh脚本,而且记得同时要有梯子来保证网络稳定
3、期间一切都是自动化,如果缺少任何lib(比如automake、libtool等等)可以通过brew install xxx进行解决
4、当autogen.sh的脚本ready后,就运行configure.sh脚本
5、然后运行 make
来编译未编译的依赖包
6、然后运行 make check
来检查依赖包是否完整
7、然后运行 make install
开始安装
8、泡杯咖啡
9、安装成功后,输入protoc --version
会返回libprotoc 2.6.1
即表示成功了
写一个.proto文件
protobuf的使用方式很简单,先写好.proto文件后,使用protoc命令来生成对应平台的文件,再放入项目中使用
Proto的语法可以去官网查看 Proto2 语法指南
新建一个文件,文件名就是类名,后缀为.proto,我这里暂时叫Demo.proto
//定义proto版本
syntax = "proto2";
//当protoc生成.java时候的package name
option java_package = "com.patrick.proto";
//生成一个Person的类(结构体)
message Person{
//required 表示该属性是必须
required string name = 1;
required int32 age = 2;
//optional 表示该属性是可选
optional string from = 3;
//还有repeated、reserved等关键字段自行查询了
}
保存后
在终端上输入protoc --java_out=./ demo.proto
--java_out=./表示输出是当前目录
那么你就能看到一个Demo的java类
当通过proto来生成了对应的java类后,直接放到项目里即可
然后在build.gradle的dependencies里面添加
compile 'com.google.protobuf:protobuf-java:2.6.1'
protobuf-java的版本一定要和安装proto的版本一致
加入dependence后,使用起来非常简单
生成一个person
Person person = Person.newBuilder()
.setName("demo name")
.setAge(20)
.setForm("Guangzhou")
.build()
//把person序列化为byte[]
person.toByteArray()
//当接收到byte[]的person,反序列化为person对象
Person.parseFrom(byte[])
如果有场景真的需要把protobuf对象序列化为json的话,可使用google提供的protobuf-java-format
同样的,在dependence加入
compile 'com.googlecode.protobuf-java-format:protobuf-java-format:1.4'
用法:
JsonFormat jsonFormat = new JsonFormat();
String person2json = jsonFormat.printToString(person);
上面是最简单的操作,高级的功能,还是去官网看吧~
性能效果参考: