前言
之前写过一篇Android socket高级用法(自定义协议和Protocol Buffer使用)的文章,但是最近想用一个Netty和Protobuf写一个关于IM的项目发现自己竟然忘了如何使用了。果然是不记录就会忘记啊,所以就有了今天这篇文章
首先
- 什么是
Protobuf
?
Protocol Buffers,是Google公司开发的一种数据描述语言,是一种平台无关、语言无关、可扩展且类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
- 为什么要使用?
- 更简单
- 数据描述文件只需原来的1/10至1/3
- 解析速度是原来的20倍至100倍
- 减少了二义性
- 生成了更容易在编程中使用的数据访问类且支持多种编程语言
- 支持语言
Language | Source |
---|---|
C++ (include C++ runtime and protoc) | src |
Java | java |
Python | python |
Objective-C | objectivec |
C # | csharp |
JavaScript | js |
Ruby | ruby |
Go | golang/protobuf |
PHP | php |
Dart | dart-lang/protobuf |
其次
- Android中如何使用?
在项目的build.gradle中配置protobuf
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12'//配置plugin的版本信息
注意:我这里的版本是0.8.12,你可以产看protobuf版本自行下载对应版本
在moudle的build.gradle下配置protobuf
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.protobuf'
//编写编译任务,调用plugin编译生成java文件
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'//编译器版本
}
plugins {
javalite {
//指定当前工程使用的protobuf版本为javalite版,以生成javalite版的java类
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks.generatedFilesBaseDir = "$projectDir/src/main/java" //指定编译生成java类的存放位置
generateProtoTasks {
all().each { task ->
task.plugins {
javalite {
outputSubDir = '' //指定存放位置的二级目录,这里未指定
}
}
}
}
}
//指定原始.proto文件的位置
android {
sourceSets {
main {
java {
srcDirs 'src/main/java'
}
proto {
srcDirs 'src/main/proto'
}
}
}
}
注意:我这里的protobuf
编译版本和javalite
对应的版本都是3.0.0,你可以根据自己的需要选择对应的版本
//protobuf
implementation 'com.google.protobuf:protobuf-java:3.0.0'
implementation 'com.google.protobuf:protoc:3.0.0'
注意:这里依赖的和上面编译的版本保持一致或者相对应,要不可能编译通不过
创建protobuf文件
-
1、创建
proto
包,并且在proto
包下创建sendMsg.proto
文件syntax = "proto3"; message Request { int32 uid = 1; string api_token = 2; }
-
2、直接编译,编译后发现在
java
包下会生成一个bebug
包,并且在debug包下会生成对应的sendMsg
的java
文件,如下图所示
-
3、调用
fun sendMsg(apiToken: String, uid: Int) { val builder = SendMsg.Request .newBuilder() .setApiToken(apiToken) .setUid(uid) .build() }
这里用的是
kotlin
方法直接将apiToken和uid传入,然后将builder当成一个参数去使用即可。
最后
好了,这就是今天的关于
protobuf
的文章,以后用到的知识点还是需要自己记录一下的。嗯,如有疑问可以水群(493180098
)探讨啊。