前言
之前寫過一篇Android socket高級用法(自定義協(xié)議和Protocol Buffer使用)的文章拂共,但是最近想用一個Netty和Protobuf寫一個關(guān)于IM的項目發(fā)現(xiàn)自己竟然忘了如何使用了娜汁。果然是不記錄就會忘記啊萌狂,所以就有了今天這篇文章
首先
- 什么是
Protobuf
谷丸?
Protocol Buffers茶鹃,是Google公司開發(fā)的一種數(shù)據(jù)描述語言,是一種平臺無關(guān)敢订、語言無關(guān)泄朴、可擴展且類似于XML能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲棒妨、通信協(xié)議等方面踪古。
- 為什么要使用含长?
- 更簡單
- 數(shù)據(jù)描述文件只需原來的1/10至1/3
- 解析速度是原來的20倍至100倍
- 減少了二義性
- 生成了更容易在編程中使用的數(shù)據(jù)訪問類且支持多種編程語言
- 支持語言
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伏穆,你可以產(chǎn)看protobuf版本自行下載對應(yīng)版本
在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'
//編寫編譯任務(wù)拘泞,調(diào)用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
對應(yīng)的版本都是3.0.0,你可以根據(jù)自己的需要選擇對應(yīng)的版本
//protobuf
implementation 'com.google.protobuf:protobuf-java:3.0.0'
implementation 'com.google.protobuf:protoc:3.0.0'
注意:這里依賴的和上面編譯的版本保持一致或者相對應(yīng)陪腌,要不可能編譯通不過
創(chuàng)建protobuf文件
-
1、創(chuàng)建
proto
包烟瞧,并且在proto
包下創(chuàng)建sendMsg.proto
文件syntax = "proto3"; message Request { int32 uid = 1; string api_token = 2; }
-
2诗鸭、直接編譯,編譯后發(fā)現(xiàn)在
java
包下會生成一個bebug
包参滴,并且在debug包下會生成對應(yīng)的sendMsg
的java
文件,如下圖所示
-
3强岸、調(diào)用
fun sendMsg(apiToken: String, uid: Int) { val builder = SendMsg.Request .newBuilder() .setApiToken(apiToken) .setUid(uid) .build() }
這里用的是
kotlin
方法直接將apiToken和uid傳入,然后將builder當成一個參數(shù)去使用即可砾赔。
最后
好了蝌箍,這就是今天的關(guān)于
protobuf
的文章,以后用到的知識點還是需要自己記錄一下的暴心。嗯妓盲,如有疑問可以水群(493180098
)探討啊。