序列化空间效率对比:
数据格式 | 5000条数据 |
---|---|
Protobuf | 22MB |
Json | 29MB |
从上面的数据可以看出来,Protobuf序列化时,和Json对比,不管在时间和空间上都是更加高效。由于篇幅的原因就不展示反序列化的数据对比了。
- 支持向后兼容和向前兼容
当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用
- 支持多种编程语言
在Google官方发布的源代码中包含了c++、java、Python三种语言
至于缺点,Protobuf采用了二进制格式进行编码,这直接导致了可读性差;缺乏自描述,Protobuf是二进制格式的协议内容,要是不配合proto结构体根本看不出来什么来。
接入
在项目的根gradle配置如下
dependencies {
classpath ‘com.google.protobuf:protobuf-gradle-plugin:0.8.0’
}
在gradle中配置如下:
apply plugin: ‘com.google.protobuf’
android {
sourceSets {
main {
// 定义proto文件目录
proto {
srcDir ‘src/main/proto’
include ‘**/*.proto’
}
}
}
}
dependencies {
// 定义protobuf依赖,使用精简版
compile “com.google.protobuf:protobuf-lite:3.0.0”
compile (‘com.squareup.retrofit2:converter-protobuf:2.2.0’) {
exclude group: ‘com.google.protobuf’, module: ‘protobuf-java’
}
}
protobuf {
protoc {
artifact = ‘com.google.protobuf:protoc:3.0.0’
}
plugins {
javalite {
artifact = ‘com.google.protobuf:protoc-gen-javalite:3.0.0’
}
}
generateProtoTasks {
all().each { task ->
task.plugins {
javalite {}
}
}
}
}
apply plugin: 'com.google.protobuf'
是Protobuf的Gradle插件,帮助我们在编译时通过语义分析自动生成源码,提供数据结构的初始化、序列化以及反序列等接口。
compile "com.google.protobuf:protobuf-lite:3.0.0"
是Protobuf支持库的精简版本,在原有的基础上