中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中的Protobuf怎么使用

發布時間:2022-02-07 15:53:44 來源:億速云 閱讀:359 作者:iii 欄目:開發技術

本篇內容介紹了“Android中的Protobuf怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    前言

    Protobuf,類似于json和xml,是一種序列化結構數據機制,可以用于數據通訊等場景,相對于xml而言更小,相對于json而言解析更快,支持多語言。

    一、Proto文件示例

    Protobuf使用.proto文件來定義數據格式,所以我們首先新建立一個person.proto文件,并在文件中填下如下內容:

    //指定proto的版本為proto3,不寫的話默認為proto2.
    syntax = "proto3";
    //包名
    package proto;
    //引入包
    //import "";
    //指定生成類所在的Java包名
    option java_package = "com.example.demowork1";
    //重命名,如果不寫,默認為文件名的首字母大寫轉化生成,如本文件如果不寫則是Person
    option java_outer_classname = "PersonProto";
    
    message Person{
      string name = 1;
      int32 id = 2;
      bool boo = 3;
      string email = 4;
      string phone = 5;
    }

    這樣我們就定義好了一個基本的Person對象,下面我們對文件中的關鍵字進行一一說明:

    **syntax:**指定proto的版本,protobuf目前有proto2和proto3兩個常用版本,如果沒有聲明,則默認是proto2.

    **package:**指定包名。

    **import:**導入包,類似于java的import.

    **java_package:**指定生成類所在的包名

    **java_outer_classname:**定義當前文件的類名,如果沒有定義,則默認為文件的首字母大寫名稱

    **message:**定義類,類似于java class;可以嵌套

    **repeated:**字段可以有多個內容(包括0),類似于array

    需要注意的是在聲明了屬性之后,需要對屬性聲明一個tag(示例代碼中的:1,2,3)。

    這個tag是ProtoBuf編碼是使用來標識屬性的,因此在定義了一個message的屬性之后,最好不要再去修改屬性的tag值以免造成舊數據解析錯誤。

    二、在Android中的使用

    protobuf可以在Android中進行使用,并且集成對應的Gradle Plugin能夠快速的編譯proto文件。

    其基本的編譯流程如下:

    Android中的Protobuf怎么使用

    下面我們直接使用上面的person.proto文件來舉例說明。

    1、 plugin配置

    首先我們需要在工程目錄下的build.gradle文件中引入protobuf,示例代碼如下:

    buildscript {
        ext.kotlin_version = "1.3.72"
        repositories {
            google()
            jcenter()
            maven { url "https://jitpack.io" }
            mavenCentral()
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.1.0"
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            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
        }
    }

    然后我們還需要在Module目錄下的build.gradle文件下添加配置,示例如下:

    plugins {
      	...
        id 'com.google.protobuf'
    }
    android{
    	...
            sourceSets {
            main {
                java.srcDirs = ['src/main/java']
                jniLibs.srcDirs = ['libs']
                assets.srcDirs = ['assets']
    
                proto {
                    //指定proto文件位置,你的proto文件放置在此文件夾中
                    srcDir 'src/main/proto'
                }
            }
        }
    }
    dependencies{
    	...
    	    implementation 'com.google.protobuf:protobuf-java:3.5.1'
        	implementation 'com.google.protobuf:protoc:3.5.1'
    }
    protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地編譯器路徑
        }
    
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    remove java
                }
                task.builtins {
                    java {}// 生產java源碼
                }
            }
        }
    }

    在完成了上述配置之后,執行一下rebuild方法,這樣我們就能夠自動生成proto java class文件了。

    2.、基本調用

    下面我們在Module工程中調用一下我們生成的文件,我們先首先生成一個Person對象,然后把轉換的byte[]再解析一下查看結果是否正確,代碼如下:

            var person1 = PersonProto.Person.newBuilder().setName("Tom")
                .setId(111).setBoo(false).setEmail("123@123.com").setPhone("123456789")
                .build()
            tvData.setOnClickListener {
                var dataTemp = PersonProto.Person.parseFrom(person1.toByteArray())
                LogUtil.instance.d(dataTemp.toString())
    //            mHandler.sendEmptyMessage(1)
            }

    執行運行之后,我們能看到正確的輸出結果:

    com.example.demowork1 D/message: name: "Tom"
        id: 111
        email: "123@123.com"
        phone: "123456789"

    “Android中的Protobuf怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    南丹县| 密山市| 徐闻县| 古交市| 奈曼旗| 滨海县| 金华市| 固阳县| 阿克陶县| 和硕县| 乐业县| 景德镇市| 太仆寺旗| 丰台区| 习水县| 扶绥县| 阳曲县| 山东省| 达孜县| 常德市| 惠水县| 达拉特旗| 北海市| 甘肃省| 井冈山市| 松滋市| 儋州市| 诸城市| 长葛市| 莒南县| 上杭县| 随州市| 翼城县| 康马县| 谷城县| 兴和县| 集贤县| 鹤庆县| 云和县| 姚安县| 铅山县|