Protocol Buffers是一種序列化數(shù)據(jù)結(jié)構(gòu)的協(xié)議庆聘。對于通過管線(pipeline)或存儲數(shù)據(jù)進行通信的程序開發(fā)上是很有用的掏觉。這個方法包含一個接口描述語言澳腹,描述一些數(shù)據(jù)結(jié)構(gòu),并提供程序工具根據(jù)這些描述產(chǎn)生代碼羊娃,用于將這些數(shù)據(jù)結(jié)構(gòu)產(chǎn)生或解析數(shù)據(jù)流邮利。
它不依賴于語言和平臺并且可擴展性極強。現(xiàn)階段官方支持C++方庭、JAVA、Python三種編程語言运悲,但可以找到大量的幾乎涵蓋所有語言的第三方拓展包。
通過它扇苞,你可以定義你的數(shù)據(jù)的結(jié)構(gòu)寄纵,并生成基于各種語言的代碼脖苏。這些你定義的數(shù)據(jù)流可以輕松地在傳遞并不破壞你已有的程序棍潘。并且你也可以更新這些數(shù)據(jù)而現(xiàn)有的程序也不會受到任何的影響。
優(yōu)勢
比json體積更小,解析速度更快亦歉,能在弱網(wǎng)的時候傳輸?shù)母斐┭啤R驗槭嵌M制流不易閱讀,天然具備加密功能荠呐。
劣勢
因為是二進制流,所以抓包調(diào)試會不方便泥张。另外得使用腳本生成代碼,所以開發(fā)效率較低媚创。支持的第三方庫也比較少。
使用ProtoBuf
1.下載地址下載對應(yīng)需要的包鳄橘,如果你需要生成java文件下載java對應(yīng)的包即可挥唠。(或者通過是用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的環(huán)境已經(jīng)搭好了晒衩。
3.創(chuàng)建proto類
syntax = "proto3";//版本
package cn.xiaoneng.npigeon.sdk.message;//包路徑
option java_outer_classname = "NetWorkMessageProbuf";//class名字
message NetworkMessage {
// messageid,必填
string messageid = 1;
// 消息類型
int32 type = 2;
// 發(fā)送者
string fromUser = 3;
然后執(zhí)行命令
protoc -I=ProtoSourceFileDirectory --java_out=JavaClassOutputDirectory ProtoSourFilePath
ProtoSourceFileDirectory:Proto源文件所在的目錄
JavaClassOutputDirectory:JavaClass文件的輸出目錄
ProtoSourFilePath:Proto源文件的絕對地址
4.最后調(diào)用parseFrom就可以解析字節(jié)流或者字節(jié)數(shù)組生成對應(yīng)的對象
NetWorkMessageProbuf.NetworkMessage networkMessage = NetWorkMessageProbuf.NetworkMessage.parseFrom(message.getPayload());