記錄 protobuf gradle plugin 生成 序列化文件

眾所周知,xml 和 json 常見(jiàn)的订晌、應(yīng)用廣泛的序列化和反序列化協(xié)議虏辫,而 google 自家出產(chǎn)的 Protobuf 也是具備了優(yōu)秀協(xié)議所需要的眾多典型特征。

  • 標(biāo)準(zhǔn)的 IDL 和 IDL編譯器锈拨,這使得對(duì)工程師非常友好
  • 序列化數(shù)據(jù)非常簡(jiǎn)潔砌庄,與 xml 相比,其序列化后的數(shù)據(jù)大小約 xml 的1/3到1/10
  • 解析速度非侈仁啵快娄昆,對(duì)比 xml,是其的20-100倍
  • 提供了友好的動(dòng)態(tài)庫(kù)缝彬,使用簡(jiǎn)單萌焰,反序列化只需要一行代碼

那在 android 如何簡(jiǎn)單快捷地使用 protobuf 呢

android 提供了一個(gè)插件 protobuf gradle plugin,在構(gòu)建時(shí)生成序列化文件

  • 根目錄 build.gradle 配置 protobuf gradle plugin
buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        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
    }
}

  • 項(xiàng)目 build.gradle 配置 protobuf
apply plugin: 'com.google.protobuf'  //聲明插件
. . .
android {
    . . .
    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            proto {
                srcDir 'src/main/protoBean'  // proto 文件位置
            }
        }
    }

}
protobuf {  //配置 proto 編譯器
    protoc {
        artifact = 'com.google.protobuf:protoc:3.5.1'  //注意 這里版本號(hào)需要與 protobuf-java lib 一致
    }
    //這里配置生成目錄跌造,編譯后會(huì)在 build\generated\source\proto 的目錄下生成對(duì)應(yīng)的java文件
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
            }
        }
    }
}
dependencies{
       . . .
     implementation 'com.google.protobuf:protobuf-java:3.5.1' //依賴(lài) protobuf-java lib
}
  • proto 文件杆怕,即需要序列化的文件
syntax = "proto3";

option java_package = "com.wjc.jcdemolist.demo.protoBuf";
option java_outer_classname = "_StudentSerializable";

message _Student {
    //指定字段的類(lèi)型 定義字段的編號(hào)族购,在Protocol Buffers中壳贪,字段的編號(hào)非常重要
    // 字段名僅僅是作為參考和生成代碼用。需要注意的是字段的編號(hào)區(qū)間范圍寝杖,
    //其中19000 ~ 19999被Protocol Buffers作為保留字段
    string name = 1;
    string sax = 2;
    int32 age = 3;
    //required指定該字段必須賦值违施,禁止為空(在v3中該約束被移除);optional指定字段為可選字段瑟幕,可以為空磕蒲,
    //對(duì)于optional字段還可以使用[default]指定默認(rèn)值,如果沒(méi)有指定只盹,則會(huì)使用字段類(lèi)型的默認(rèn)值
    repeated _Course course = 4; //使用repeated指定字段為集合

}
//在一個(gè)proto文件中可以同時(shí)定義多個(gè)message類(lèi)型辣往,生成代碼時(shí)根據(jù)生成代碼的目標(biāo)語(yǔ)言不同,
//處理的方式不太一樣殖卑,如Java會(huì)針對(duì)每個(gè)message類(lèi)型生成一個(gè).java文件
message _Course {
    string name = 1;
    float score = 2;
}

proto 語(yǔ)法這里就不說(shuō)講啦站削,如需要詳情了解,自個(gè)百度吧
注意在項(xiàng)目 build.gradle 中孵稽,需要把這個(gè)文件路徑放入配置中

  • 生成 protobuf.java 代碼
    android studio 下 Build -> Rebuild Project 后许起,在 build \ generated \ source \ proto 會(huì)生成對(duì)應(yīng) protobuf java 代碼

生了 protobuf java 十偶,那如何用呢,請(qǐng)看下面

public static byte[] serialize() {
    _StudentSerializable._Course.Builder courseBuilder = _StudentSerializable._Course.newBuilder()
            .setName("中文").setScore(149);
    _StudentSerializable._Student.Builder studentBuilder = _StudentSerializable._Student.newBuilder();
    studentBuilder.setName("Jc").setAge(16).setSax("man").addCourse(courseBuilder);
    _StudentSerializable._Student student = studentBuilder.build();
    return student.toByteArray();
}

public static _StudentSerializable._Student deserialize(byte[] bs) {
    try {
        return _StudentSerializable._Student.parseFrom(bs);
    } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
    }
    return null;
}

使用起來(lái)园细,是很簡(jiǎn)單吧惦积,序列化使用 builder 模式,而反序列化一行代碼就行了


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猛频,一起剝皮案震驚了整個(gè)濱河市狮崩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹿寻,老刑警劉巖厉亏,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烈和,居然都是意外死亡爱只,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)招刹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恬试,“玉大人,你說(shuō)我怎么就攤上這事疯暑⊙挡瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵妇拯,是天一觀的道長(zhǎng)幻馁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)越锈,這世上最難降的妖魔是什么仗嗦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮甘凭,結(jié)果婚禮上稀拐,老公的妹妹穿的比我還像新娘。我一直安慰自己丹弱,他們只是感情好德撬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著躲胳,像睡著了一般蜓洪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坯苹,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天隆檀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死刚操,一個(gè)胖子當(dāng)著我的面吹牛闸翅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菊霜,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坚冀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鉴逞?” 一聲冷哼從身側(cè)響起记某,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎构捡,沒(méi)想到半個(gè)月后液南,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勾徽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年滑凉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘帚。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畅姊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吹由,到底是詐尸還是另有隱情若未,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布倾鲫,位于F島的核電站粗合,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乌昔。R本人自食惡果不足惜隙疚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玫荣。 院中可真熱鬧甚淡,春花似錦大诸、人聲如沸捅厂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焙贷。三九已至,卻和暖如春贿堰,著一層夾襖步出監(jiān)牢的瞬間辙芍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留故硅,地道東北人庶灿。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吃衅,于是被迫代替她去往敵國(guó)和親往踢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353