Protobuf是一種平臺(tái)無(wú)關(guān)、語(yǔ)言無(wú)關(guān)、可擴(kuò)展且輕便高效的序列化數(shù)據(jù)結(jié)構(gòu)的協(xié)議,可以用于網(wǎng)絡(luò)通信和數(shù)據(jù)存
儲(chǔ)。 可簡(jiǎn)單類比于 XML ,其具有以下特點(diǎn):
語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān): ProtoBuf 支持 Java、C++、Python 等多種語(yǔ)言,支持多個(gè)平臺(tái)
高效:比 XML 更?。? ~ 10倍)、更快(20 ~ 100倍)、更為簡(jiǎn)單
擴(kuò)展性、兼容性好:可以更新數(shù)據(jù)結(jié)構(gòu),而不影響和破壞原有的舊程序
總之、protobuf作為二進(jìn)制數(shù)據(jù)格式,比json、xml的壓縮比大、序列化效率高,同時(shí)能兼容舊程序,跨語(yǔ)言,跨平臺(tái)
一、引入插件
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.13'
}
}
apply plugin: 'com.google.protobuf'
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.11.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
}
dependencies{
implementation 'com.google.protobuf:protobuf-javalite:3.11.0'
}
二、安裝IDEA插件并編寫proto文件

在Java同級(jí)目錄下創(chuàng)建proto目錄,并創(chuàng)建一個(gè)helloword.proto文件

三、執(zhí)行編譯

四、開(kāi)始使用
Helloword.HelloRequest helloRequest =
Helloword.HelloRequest.newBuilder().setName("Lance")
.setAge(18)
.build();
//獲得序列化后數(shù)據(jù)大小
helloRequest.getSerializedSize();
//序列化
byte[] bytes = helloRequest.toByteArray();
//反序列化
try {
Helloword.HelloRequest helloRequest1 = Helloword.HelloRequest.parseFrom(bytes);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
附錄一:混淆配置:
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
附錄二:Protobuf數(shù)據(jù)結(jié)構(gòu)
float? 對(duì)應(yīng)java中的float
double 對(duì)應(yīng)java中的double
int32?對(duì)應(yīng)java中的int
int64?對(duì)應(yīng)java中的long
bytes?對(duì)應(yīng)java中的ByteString
bool?對(duì)應(yīng)java中的boolean
string 對(duì)應(yīng)java中的String
unit32 對(duì)應(yīng)java中的int
unit64 對(duì)應(yīng)java中的long