您好,登錄后才能下訂單哦!
本篇內容介紹了“Android中的Protobuf怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Protobuf,類似于json和xml,是一種序列化結構數據機制,可以用于數據通訊等場景,相對于xml而言更小,相對于json而言解析更快,支持多語言。
Protobuf使用.proto
文件來定義數據格式,所以我們首先新建立一個person.proto
文件,并在文件中填下如下內容:
//指定proto的版本為proto3,不寫的話默認為proto2. syntax = "proto3"; //包名 package proto; //引入包 //import ""; //指定生成類所在的Java包名 option java_package = "com.example.demowork1"; //重命名,如果不寫,默認為文件名的首字母大寫轉化生成,如本文件如果不寫則是Person option java_outer_classname = "PersonProto"; message Person{ string name = 1; int32 id = 2; bool boo = 3; string email = 4; string phone = 5; }
這樣我們就定義好了一個基本的Person對象,下面我們對文件中的關鍵字進行一一說明:
**syntax:**指定proto的版本,protobuf目前有proto2和proto3兩個常用版本,如果沒有聲明,則默認是proto2.
**package:**指定包名。
**import:**導入包,類似于java的import.
**java_package:**指定生成類所在的包名
**java_outer_classname:**定義當前文件的類名,如果沒有定義,則默認為文件的首字母大寫名稱
**message:**定義類,類似于java class;可以嵌套
**repeated:**字段可以有多個內容(包括0),類似于array
需要注意的是在聲明了屬性之后,需要對屬性聲明一個tag(示例代碼中的:1,2,3)。
這個tag是ProtoBuf編碼是使用來標識屬性的,因此在定義了一個message的屬性之后,最好不要再去修改屬性的tag值以免造成舊數據解析錯誤。
protobuf可以在Android中進行使用,并且集成對應的Gradle Plugin能夠快速的編譯proto文件。
其基本的編譯流程如下:
下面我們直接使用上面的person.proto文件來舉例說明。
首先我們需要在工程目錄下的build.gradle
文件中引入protobuf,示例代碼如下:
buildscript { ext.kotlin_version = "1.3.72" repositories { google() jcenter() maven { url "https://jitpack.io" } mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:4.1.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
然后我們還需要在Module目錄下的build.gradle
文件下添加配置,示例如下:
plugins { ... id 'com.google.protobuf' } android{ ... sourceSets { main { java.srcDirs = ['src/main/java'] jniLibs.srcDirs = ['libs'] assets.srcDirs = ['assets'] proto { //指定proto文件位置,你的proto文件放置在此文件夾中 srcDir 'src/main/proto' } } } } dependencies{ ... implementation 'com.google.protobuf:protobuf-java:3.5.1' implementation 'com.google.protobuf:protoc:3.5.1' } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地編譯器路徑 } generateProtoTasks { all().each { task -> task.builtins { remove java } task.builtins { java {}// 生產java源碼 } } } }
在完成了上述配置之后,執行一下rebuild方法,這樣我們就能夠自動生成proto java class文件了。
下面我們在Module工程中調用一下我們生成的文件,我們先首先生成一個Person對象,然后把轉換的byte[]再解析一下查看結果是否正確,代碼如下:
var person1 = PersonProto.Person.newBuilder().setName("Tom") .setId(111).setBoo(false).setEmail("123@123.com").setPhone("123456789") .build() tvData.setOnClickListener { var dataTemp = PersonProto.Person.parseFrom(person1.toByteArray()) LogUtil.instance.d(dataTemp.toString()) // mHandler.sendEmptyMessage(1) }
執行運行之后,我們能看到正確的輸出結果:
com.example.demowork1 D/message: name: "Tom" id: 111 email: "123@123.com" phone: "123456789"
“Android中的Protobuf怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。