最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中使用protobuf的具體示例

 更新時間:2018年03月09日 14:11:07   作者:Aron1001  
本篇文章主要介紹了Android中使用protobuf的具體示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

簡介

Google Protocol Buffers 簡稱 Protobuf,類似 json 或 XML,是一種序列化結(jié)構(gòu)數(shù)據(jù)的機(jī)制,但是比它們更小、更快、更簡單。同時支持多語言,跨平臺。

目前主要有兩個大版本:proto2 和 proto3。

其中 proto2 支持 Java、Python、 Objective-C、和 C++。

proto3 增加了對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文件來定義數(shù)據(jù)格式,并同時提供編譯器將這些文件編譯為各種語言的源碼。

message 格式非常簡單。每種類型的 message 包含一個或者多個唯一編碼字段,每個字段由名稱和值類型組成,值類型可以是數(shù)字(整形或者浮點(diǎn)型)、布爾值、字符串、原始字節(jié),甚至是其他的 message(如上例所示)。Protobuf 允許 message 中包含 message,以達(dá)到分層嵌套。

值得注意的一點(diǎn)是,每個屬性都有唯一的一個tag,上面的0,1,2...等,這些tag非常重要,是 Prodobuf 編碼時使用的對每個屬性的唯一標(biāo)識符————Prodobuf 并不使用屬性名(name,id,email...)來編碼。因而,在定義過一個 message 之后,原則上都不應(yīng)該再修改每個屬性的tag,因?yàn)橐坏┬薷?,可能就會出現(xiàn)新老數(shù)據(jù)版本解析出錯的問題。

關(guān)鍵字

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

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

在Android中的使用

先來看一下是proto在安卓使用中的流程:


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

通過proto文件,編譯生成proto java class,生成的類中包含你需要的getter/setter,這個java class就類似于我們平常所用的java bean,但其還包含很多很多的別的功能函數(shù)。在android中, 我們可以通過集成Gradle Plugin for Protobuf來編譯proto文件。
Android Studio 配置

在項目根的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同級):

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)境就配置好了。此時可以編譯你的項目,會生成proto java class。這個類就是我們app后面要使用的。

代碼示例

定義proto文件:

syntax = "proto3";
package tutorial;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  string phone = 4;
}

通過網(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());

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

最新評論

桑日县| 平顺县| 盐城市| 息烽县| 青河县| 永德县| 建平县| 深圳市| 山阳县| 甘泉县| 浦北县| 洛阳市| 绥滨县| 米泉市| 洪江市| 五常市| 富源县| 张家港市| 石城县| 闵行区| 墨脱县| 西和县| 汉寿县| 利辛县| 景东| 青岛市| 彭山县| 和林格尔县| 淄博市| 盐津县| 凉山| 凌源市| 沈丘县| 巫溪县| 拜泉县| 南丰县| 西吉县| 崇义县| 南安市| 祁东县| 和平县|