ProtoBuf在Android中的簡單使用

ProtoBuf是Google的一個開源項目是鬼。作用于數據存儲僧须、數據通信和語言無關平臺無關纲刀,擴展便捷。它是一個靈活皆辽、高效柑蛇、自動化的序列化和結構化數據格式,比XML協議的數據格式更小驱闷,更快和更簡單。你可以定義你想要的數據結構空免,然后使用ProtoBuf提供的編譯器生成相應平臺的源代碼空另,編譯器自動化會生成讀寫你結構化數據代碼,然后可以把源碼應用于各種語言蹋砚,你甚至可以在更新數據結構情況下不破壞已經部署基于老格式編譯程序扼菠。

項目github地址

ProtoBuf GitHub

ProtoBuf英文文檔說明

protocol-buffers

Android中使用

  • Gradle依賴ProtoBuf庫

根目錄gradle引入classpath

   dependencies {
          classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
   }
  • 項目目錄gradle依賴ProtoBuf庫摄杂,依賴后可以自動編譯定義好的proto文件,大大節(jié)省工作量循榆。
  apply plugin: 'com.google.protobuf'
  protobuf {
      protoc {
          // Download from repositories
          artifact = 'com.google.protobuf:protoc:3.2.0'
      }
      plugins {
          javalite {
              // The codegen for lite comes as a separate artifact
              artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
          }
      }
      generateProtoTasks {
          all().each { task ->
              task.plugins {
                  javalite {}
              }
          }
      }
  }

  dependencies {
      compile "com.google.protobuf:protobuf-lite:3.0.1"
      compile 'com.google.protobuf:protobuf-java:3.0.0'
  }

定義proto消息文件

創(chuàng)建一個.proto文件析恢,一般做法是在main文件下創(chuàng)建一個proto用于存放pro文件。


這是官方給的實例如何定義proto的文件內容

  option java_package = "com.jinwei.test.pb";
  option java_outer_classname = "BaseProto";

  message Person {
      required string name = 1;
      required int32 id = 2;
      optional string email = 3;

      enum PhoneType {
          MOBILE = 0;
          HOME = 1;
          WORK = 2;
      }

      message PhoneNumber {
          required string number = 1;
          optional PhoneType type = 2 [default = HOME];
      }
      //repeated=集合
      repeated PhoneNumber phones = 4;
  }
  enum PhoneType {
      MOBILE = 0;
      HOME = 1;
      WORK = 2;
  }

  message AddressBook {
      //repeated=集合
      repeated Person people = 1;
  }

option java_package = "com.jinwei.test.pb";
存放的包名 編譯后源碼生成在bild/generated/source/proto目錄中

option java_outer_classname = "BaseProto";
生成后輸出的類名秧饮,不寫默認是文件名字大寫開頭映挂。

message 消息類似于一個類。

proto的三個修飾符說明

  • required
    對于required的字段而言盗尸,初值是必須要提供的柑船,否則字段的便是未初始化的。在Debug模式的buffer庫下編譯的話泼各,序列化話的時候可能會失敗鞍时,而且在反序列化的時候對于該字段的解析會總是失敗的。所以扣蜻,對于修飾符為required的字段逆巍,請在序列化的時候務必給予初始化。

  • optional
    對于optional的字段而言莽使,如果未進行初始化锐极,那么一個默認值將賦予該字段,當然也可以指定默認值吮旅,如上述proto定義中的PhoneType字段類型溪烤。

  • repeated
    對于repeated的字段而言,該字段可以重復多個庇勃,google提供的這個addressbook例子便有個很好的該修飾符的應用場景檬嘀,即每個人可能有多個電話號碼。在高級語言里面责嚷,我們可以通過數組來實現鸳兽,而在proto定義文件中可以使用repeated來修飾,從而達到相同目的罕拂。當然揍异,出現0次也是包含在內的。

    其中字段標簽標示了字段在二進制流中存放的位置爆班,這個是必須的衷掷,而且序列化與反序列化的時候相同的字段的Tag值必須對應,否則反序列化會出現意想不到的問題柿菩。

proto中的type在不同編程語言中對應的類型

類型表

定義完內容后build下項目戚嗅,生成的源文件會在圖中的這個包中


使用Protocol

在網絡傳輸中使用Proto是通過字節(jié)輸出和輸入,所以生成的源碼會包含相關的編解碼方法,內部已經封裝好了編解碼的一些具體實現懦胞,生成后的pro類文件里面已經自動生成了相應編解碼的方法替久。

  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       //新構建一個對象
        BaseProto.Person.Builder builder = BaseProto.Person.newBuilder();
       //通過get set方法來訪問字段
        builder.getEmail();
        builder.setEmail("email");
        builder.setId(1);
}

生成的文件提供了相應的解碼方法


后續(xù)學習篇

官方語言指南
譯Protobuf 語法指南

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躏尉,隨后出現的幾起案子蚯根,更是在濱河造成了極大的恐慌,老刑警劉巖胀糜,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅拦,死亡現場離奇詭異,居然都是意外死亡僚纷,警方通過查閱死者的電腦和手機矩距,發(fā)現死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怖竭,“玉大人锥债,你說我怎么就攤上這事∪簦” “怎么了哮肚?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長广匙。 經常有香客問我允趟,道長,這世上最難降的妖魔是什么鸦致? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任潮剪,我火速辦了婚禮,結果婚禮上分唾,老公的妹妹穿的比我還像新娘抗碰。我一直安慰自己,他們只是感情好绽乔,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布弧蝇。 她就那樣靜靜地躺著,像睡著了一般折砸。 火紅的嫁衣襯著肌膚如雪看疗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天睦授,我揣著相機與錄音两芳,去河邊找鬼。 笑死去枷,一個胖子當著我的面吹牛盗扇,可吹牛的內容都是我干的祷肯。 我是一名探鬼主播沉填,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼疗隶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翼闹?” 一聲冷哼從身側響起斑鼻,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猎荠,沒想到半個月后坚弱,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡关摇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年荒叶,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输虱。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡些楣,死狀恐怖,靈堂內的尸體忽然破棺而出宪睹,到底是詐尸還是另有隱情愁茁,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布亭病,位于F島的核電站鹅很,受9級特大地震影響,放射性物質發(fā)生泄漏罪帖。R本人自食惡果不足惜促煮,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望整袁。 院中可真熱鬧菠齿,春花似錦、人聲如沸葬项。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民珍。三九已至襟士,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚷量,已是汗流浹背陋桂。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝶溶,地道東北人嗜历。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓宣渗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梨州。 傳聞我的和親對象是個殘疾皇子痕囱,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容