国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android中使用protobuf的具體示例

2019-10-22 18:14:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

簡(jiǎn)介

Google Protocol Buffers 簡(jiǎn)稱(chēng) Protobuf,類(lèi)似 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)單。每種類(lèi)型的 message 包含一個(gè)或者多個(gè)唯一編碼字段,每個(gè)字段由名稱(chēng)和值類(lèi)型組成,值類(lèi)型可以是數(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)鍵字

  1. syntax:聲明版本。例如上面syntax="proto3",如果沒(méi)有聲明,則默認(rèn)是proto2。
  2. package:聲明包名.
  3. import:導(dǎo)入包。類(lèi)似于java,例如上面導(dǎo)入了timestamp.proto包。
  4. java_package:指定生成的類(lèi)應(yīng)該放在什么Java包名下。如果你沒(méi)有顯式地指定這個(gè)值,則它簡(jiǎn)單地匹配由package 聲明給出的Java包名,但這些名字通常都不是合適的Java包名 (由于它們通常不以一個(gè)域名打頭)。
  5. java_outer_classname:定義應(yīng)該包含這個(gè)文件中所有類(lèi)的類(lèi)名。如果你沒(méi)有顯式地給定java_outer_classname ,則將通過(guò)把文件名轉(zhuǎn)換為首字母大寫(xiě)來(lái)生成。例如上面例子編譯生成的文件名和類(lèi)名是AddressBookProtos。
  6. message:類(lèi)似于java中的class關(guān)鍵字。
  7. repeated:用于修飾屬性,表示對(duì)應(yīng)的屬性是個(gè)array。

更多的關(guān)鍵字可以參考官方文檔,這里不做介紹。

Android中的使用

先來(lái)看一下是proto在安卓使用中的流程:

Android,protobuf,使用

首先創(chuàng)建proto文件,該文件定義了你要使用的數(shù)據(jù)的數(shù)據(jù)格式。

通過(guò)proto文件,編譯生成proto java class,生成的類(lèi)中包含你需要的getter/setter,這個(gè)java class就類(lèi)似于我們平常所用的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 , 添加依賴(lài):

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è)類(lèi)就是我們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í)體類(lèi),就可以在界面進(jìn)行顯示了:

textView.setText(person.toString());

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌兰县| 宣恩县| 肥乡县| 三门县| 永昌县| 海原县| 河间市| 板桥市| 澄迈县| 晋中市| 乌海市| 湘潭市| 鹤庆县| 沧源| 襄汾县| 富阳市| 大城县| 郸城县| 陕西省| 阜城县| 德惠市| 钟山县| 木兰县| 穆棱市| 绥化市| 称多县| 当涂县| 安泽县| 丹江口市| 松溪县| 高台县| 滁州市| 龙门县| 全州县| 阿克苏市| 亳州市| 平陆县| 新宁县| 凤阳县| 千阳县| 湘潭市|