最近参与一个新项目的开发,才用了ProtoBuf作为前端和后台之间的通信协议。关于ProtoBuf的知识我就不细说了,具体可参考官网https://developers.google.com/protocol-buffers/docs/proto3#json
Android Studio配置
作为google的亲儿子,可以通过配置,直接在Android Studio中根据proto文件生成java代码并使用。在移动端,推荐使用protobuf-lite版本以节省资源。
一、在project的build.gradle中添加如下内容
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
}
二、在project中增加一个proto的module,用于管理proto及生成的java文件。在其build.gradle中增加以下内容
...
apply plugin: 'com.google.protobuf'
...
android{
...
sourceSets {
main {
java {
srcDir 'src/main/java'
}
proto {
srcDir 'src/main/proto'
include '**/*.proto'
}
}
}
}
protobuf {
//这里配置protoc编译器
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
// The codegen for lite comes as a separate artifact
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
//这里配置生成目录,编译后会在build的目录下生成对应的java文件
generateProtoTasks {
all().each { task ->
task.builtins {
// In most cases you don't need the full Java output
// if you use the lite output.
remove java
}
task.plugins {
javalite {}
}
}
}
}
dependencies {
...
compile 'com.google.protobuf:protobuf-lite:3.0.0'
...
}
三、在proto模块的src/main目录下创建proto目录,用于放置.proto文件。java文件中可放置处理protobuf的一些代码,报名与.proto文件中的package保持一致。
四、编译,可在proto模块的build/generated/source/proto路径看到生成的java文件。
ProtoBuf与JSON互转
Android Studio中可使用protobuf-java-format工具实现JSON和ProtoBuf之间的转换。
1、在proto模块的build.gradle文件中增加protobuf-java-format的编译依赖
...
dependencies {
...
api 'com.googlecode.protobuf-java-format:protobuf-java-format:1.2'
}
...
2、ProtoBuf转Json
String jsonFormat = JsonFormat.printToString(protoMsg);
3、Json转ProtoBuf
JsonFormat.merge(jsonFormat, protoMsgBuilder)
注意,在protobuf中另有一个util工具库提供转化,但是测试中发现性能不及上面的JsonFormat库。该util库的编译依赖如下:
api 'com.google.protobuf:protobuf-java-util:3.6.0'
代码可参考 com.google.protobuf.util.JsonFormat.java,使用方法与上面的有所不同。
参考文档:
Protocol Buffer 3 学习笔记
Mac下protobuf安装,并用maven编译导出jar包
https://stackoverflow.com/questions/15723099/where-to-find-protobuf-jar-for-using-google-protocol-buffers-in-java
https://stackoverflow.com/questions/28545401/java-json-protobuf-back-conversion
https://proandroiddev.com/how-to-setup-your-android-app-to-use-protobuf-96132340de5c