Protocol Buffers是一种序列化数据结构的协议。对于通过管线(pipeline)或存储数据进行通信的程序开发上是很有用的。这个方法包含一个接口描述语言,描述一些数据结构,并提供程序工具根据这些描述产生代码,用于将这些数据结构产生或解析数据流。
它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。
通过它,你可以定义你的数据的结构,并生成基于各种语言的代码。这些你定义的数据流可以轻松地在传递并不破坏你已有的程序。并且你也可以更新这些数据而现有的程序也不会受到任何的影响。
优势
比json体积更小,解析速度更快,能在弱网的时候传输的更快。因为是二进制流不易阅读,天然具备加密功能。
劣势
因为是二进制流,所以抓包调试会不方便。另外得使用脚本生成代码,所以开发效率较低。支持的第三方库也比较少。
使用ProtoBuf
1.下载地址下载对应需要的包,如果你需要生成java文件下载java对应的包即可。(或者通过是用gradle脚本方式跳过1 2步骤)
apply plugin: 'com.google.protobuf'
protobuf {
protoc {
// Download from repositories
artifact = 'com.google.protobuf:protoc:3.2.0'
}
plugins {
javalite {
// The codegen for lite comes as a separate artifact
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks {
all().each { task ->
task.plugins {
javalite {}
}
}
}
}
dependencies {
compile "com.google.protobuf:protobuf-lite:3.0.1"
compile 'com.google.protobuf:protobuf-java:3.0.0'
}
2.解压包,cd protobuf-3.5.0 运行sh autogen.sh脚本,如果中途遇到缺少autoconf and automake包,请进入这个链接.再运行./configure,然后运行make,最后在运行 sudo make install ,这时候pb的环境已经搭好了。
3.创建proto类
syntax = "proto3";//版本
package cn.xiaoneng.npigeon.sdk.message;//包路径
option java_outer_classname = "NetWorkMessageProbuf";//class名字
message NetworkMessage {
// messageid,必填
string messageid = 1;
// 消息类型
int32 type = 2;
// 发送者
string fromUser = 3;
然后执行命令
protoc -I=ProtoSourceFileDirectory --java_out=JavaClassOutputDirectory ProtoSourFilePath
ProtoSourceFileDirectory:Proto源文件所在的目录
JavaClassOutputDirectory:JavaClass文件的输出目录
ProtoSourFilePath:Proto源文件的绝对地址
4.最后调用parseFrom就可以解析字节流或者字节数组生成对应的对象
NetWorkMessageProbuf.NetworkMessage networkMessage = NetWorkMessageProbuf.NetworkMessage.parseFrom(message.getPayload());