Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存
储。 可简单类比于 XML ,其具有以下特点:
语言无关、平台无关: ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
高效:比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
扩展性、兼容性好:可以更新数据结构,而不影响和破坏原有的旧程序
总之、protobuf作为二进制数据格式,比json、xml的压缩比大、序列化效率高,同时能兼容旧程序,跨语言,跨平台
一、引入插件
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同级目录下创建proto目录,并创建一个helloword.proto文件
三、执行编译
四、开始使用
Helloword.HelloRequest helloRequest =
Helloword.HelloRequest.newBuilder().setName("Lance")
.setAge(18)
.build();
//获得序列化后数据大小
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数据结构
float 对应java中的float
double 对应java中的double
int32 对应java中的int
int64 对应java中的long
bytes 对应java中的ByteString
bool 对应java中的boolean
string 对应java中的String
unit32 对应java中的int
unit64 对应java中的long