Protocol Buffer 使用总结

4,683 阅读3分钟

什么是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);  

上面是最简单的操作,高级的功能,还是去官网看吧~

性能效果参考:

美团——序列化和反序列化

Protobuffer和json深度对比

IBM——Google Protocol Buffer 的使用和原理