Android中使用protobuf的具體示例
簡(jiǎn)介
Google Protocol Buffers 簡(jiǎn)稱 Protobuf,類似 json 或 XML,是一種序列化結(jié)構(gòu)數(shù)據(jù)的機(jī)制,但是比它們更小、更快、更簡(jiǎn)單。同時(shí)支持多語(yǔ)言,跨平臺(tái)。
目前主要有兩個(gè)大版本:proto2 和 proto3。
其中 proto2 支持 Java、Python、 Objective-C、和 C++。
proto3 增加了對(duì)Go、JavaNano、Ruby、和 C#的支持。
proto例子
syntax = "proto3"; package tutorial; import "google/protobuf/timestamp.proto"; option java_package = "com.katyusha.aron.demo"; option java_outer_classname = "AddressBookProtos"; message Person { string name = 1; int32 id = 2; string email = 3; enum PhoneType{ MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; }
Protobuf使用.proto文件來(lái)定義數(shù)據(jù)格式,并同時(shí)提供編譯器將這些文件編譯為各種語(yǔ)言的源碼。
message 格式非常簡(jiǎn)單。每種類型的 message 包含一個(gè)或者多個(gè)唯一編碼字段,每個(gè)字段由名稱和值類型組成,值類型可以是數(shù)字(整形或者浮點(diǎn)型)、布爾值、字符串、原始字節(jié),甚至是其他的 message(如上例所示)。Protobuf 允許 message 中包含 message,以達(dá)到分層嵌套。
值得注意的一點(diǎn)是,每個(gè)屬性都有唯一的一個(gè)tag,上面的0,1,2...等,這些tag非常重要,是 Prodobuf 編碼時(shí)使用的對(duì)每個(gè)屬性的唯一標(biāo)識(shí)符————Prodobuf 并不使用屬性名(name,id,email...)來(lái)編碼。因而,在定義過(guò)一個(gè) message 之后,原則上都不應(yīng)該再修改每個(gè)屬性的tag,因?yàn)橐坏┬薷?,可能就?huì)出現(xiàn)新老數(shù)據(jù)版本解析出錯(cuò)的問(wèn)題。
關(guān)鍵字
- syntax:聲明版本。例如上面syntax="proto3",如果沒(méi)有聲明,則默認(rèn)是proto2。
- package:聲明包名.
- import:導(dǎo)入包。類似于java,例如上面導(dǎo)入了timestamp.proto包。
- java_package:指定生成的類應(yīng)該放在什么Java包名下。如果你沒(méi)有顯式地指定這個(gè)值,則它簡(jiǎn)單地匹配由package 聲明給出的Java包名,但這些名字通常都不是合適的Java包名 (由于它們通常不以一個(gè)域名打頭)。
- java_outer_classname:定義應(yīng)該包含這個(gè)文件中所有類的類名。如果你沒(méi)有顯式地給定java_outer_classname ,則將通過(guò)把文件名轉(zhuǎn)換為首字母大寫來(lái)生成。例如上面例子編譯生成的文件名和類名是AddressBookProtos。
- message:類似于java中的class關(guān)鍵字。
- repeated:用于修飾屬性,表示對(duì)應(yīng)的屬性是個(gè)array。
更多的關(guān)鍵字可以參考官方文檔,這里不做介紹。
在Android中的使用
先來(lái)看一下是proto在安卓使用中的流程:
首先創(chuàng)建proto文件,該文件定義了你要使用的數(shù)據(jù)的數(shù)據(jù)格式。
通過(guò)proto文件,編譯生成proto java class,生成的類中包含你需要的getter/setter,這個(gè)java class就類似于我們平常所用的java bean,但其還包含很多很多的別的功能函數(shù)。在android中, 我們可以通過(guò)集成Gradle Plugin for Protobuf來(lái)編譯proto文件。
Android Studio 配置
在項(xiàng)目根的gradle文件中添加如下內(nèi)容:
buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } }
在app module下的gradle文件中:
1 , 在apply plugin: 'com.android.application'后添加apply plugin: 'com.google.protobuf'
2, 添加protobuf塊(與android同級(jí)):
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地編譯器路徑 } generateProtoTasks { all().each { task -> task.builtins { remove java } task.builtins { java {}// 生產(chǎn)java源碼 } } } }
3, 指定.proto文件的路徑:
sourceSets { main { java { srcDir 'src/main/java' } proto { srcDir 'src/main/proto' //指定.proto文件路徑 } } }
4 , 添加依賴:
api 'com.google.protobuf:protobuf-java:3.5.1' api 'com.google.protobuf:protoc:3.5.1'
到這,android gradle環(huán)境就配置好了。此時(shí)可以編譯你的項(xiàng)目,會(huì)生成proto java class。這個(gè)類就是我們app后面要使用的。
代碼示例
定義proto文件:
syntax = "proto3"; package tutorial; message Person { string name = 1; int32 id = 2; string email = 3; string phone = 4; }
通過(guò)網(wǎng)絡(luò)獲取數(shù)據(jù)流,然后解析成proto文件定義的格式:
Request request = new Request.Builder().url(url).build(); Call call = okHttpClient.newCall(request); Response response = call.execute(); if (response.isSuccessful()) { ResponseBody responseBody = response.body(); if (responseBody != null) { return Person.parseFrom(responseBody.byteStream()); } }
有了Person實(shí)體類,就可以在界面進(jìn)行顯示了:
textView.setText(person.toString());
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Studio中Run按鈕是灰色的快速解決方法
這篇文章主要介紹了Android Studio中Run按鈕是灰色的快速解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-03-03Jetpack?Compose?的新型架構(gòu)?MVI使用詳解
這篇文章主要介紹了Jetpack?Compose?的新型架構(gòu)?MVI使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android中使用 AutoCompleteTextView 實(shí)現(xiàn)手機(jī)號(hào)格式化附帶清空歷史的操作
有個(gè)小伙伴遇到了這樣一個(gè)問(wèn)題,就是AutoCompleteTextView實(shí)現(xiàn)自動(dòng)填充的功能。同時(shí)要具備手機(jī)格式化的功能。接下來(lái)通過(guò)本文給大家分享使用 AutoCompleteTextView 實(shí)現(xiàn)手機(jī)號(hào)格式化附帶清空歷史的操作方法,需要的朋友參考下2017-03-03Android編程中ViewPage判斷左右滑動(dòng)方向的方法
這篇文章主要介紹了Android編程中ViewPage判斷左右滑動(dòng)方向的方法,涉及Android中ViewPage針對(duì)滑動(dòng)判定的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-10-10Ubuntu Android源碼以及內(nèi)核下載與編譯
本文主要介紹Android源碼的下載和編譯,這里整理了相關(guān)資料及如何下載和編譯的詳細(xì)步驟,有需要的小伙伴可以參考下2016-09-09Android仿知乎日?qǐng)?bào)開(kāi)屏頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Android仿知乎日?qǐng)?bào)開(kāi)屏頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android RecyclerView的簡(jiǎn)單使用
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView簡(jiǎn)單使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android實(shí)現(xiàn)模仿UCweb菜單效果的方法
這篇文章主要介紹了Android實(shí)現(xiàn)模仿UCweb菜單效果的方法,較為詳細(xì)的分析了Android模仿UCweb菜單效果的頁(yè)面布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10