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

Kotlin注解實(shí)現(xiàn)Parcelable序列化流程詳解

 更新時(shí)間:2022年12月13日 16:26:58   作者:cdAndroid  
有時(shí)我們會(huì)在界面跳轉(zhuǎn)的過程中,做對(duì)象傳值,這時(shí)就需要對(duì)該對(duì)象做序列化處理了。Android中對(duì)對(duì)象的序列化處理有兩種方式,這篇文章主要介紹了Kotlin注解實(shí)現(xiàn)Parcelable序列化

一. 概念介紹

1. 序列化

? 由于存在于內(nèi)存中的對(duì)象都是暫時(shí)的,無法長(zhǎng)期駐存,為了把對(duì)象的狀態(tài)保持下來,這時(shí)需要把對(duì)象寫入到磁盤或者其他介質(zhì)中,這個(gè)過程就叫做序列化。

2. 反序列化

? 反序列化恰恰是序列化的反向操作,也就是說,把已存在在磁盤或者其他介質(zhì)中的對(duì)象,反序列化(讀?。┑絻?nèi)存中,以便后續(xù)操作,而這個(gè)過程就叫做反序列化。

3. 實(shí)現(xiàn)序列化的條件

? 在Java中,一個(gè)對(duì)象要實(shí)現(xiàn)序列化操作,該類就必須實(shí)現(xiàn)了Serializable接口或者Parcelable接口,而Parcelable接口則是Android中特有的序列化接口。只要清楚知道實(shí)現(xiàn)序列化操作時(shí)必須實(shí)現(xiàn)Serializable接口或者Parcelable接口之一即可。

二. 序列化目的

(1)永久的保存對(duì)象數(shù)據(jù)(將對(duì)象數(shù)據(jù)保存在文件當(dāng)中,或者是磁盤中)

(2)通過序列化操作將對(duì)象數(shù)據(jù)在網(wǎng)絡(luò)上進(jìn)行傳輸(由于網(wǎng)絡(luò)傳輸是以字節(jié)流的方式對(duì)數(shù)據(jù)進(jìn)行傳輸?shù)?。因此序列化的目的是將?duì)象數(shù)據(jù)轉(zhuǎn)換成字節(jié)流的形式)

(3)將對(duì)象數(shù)據(jù)在進(jìn)程之間進(jìn)行傳遞(Activity之間傳遞對(duì)象數(shù)據(jù)時(shí),需要在當(dāng)前的Activity中對(duì)對(duì)象數(shù)據(jù)進(jìn)行序列化操作。在另一個(gè)Activity中需要進(jìn)行反序列化操作講數(shù)據(jù)取出)

(4)Java允許我們?cè)趦?nèi)存中創(chuàng)建可復(fù)用的Java對(duì)象,但一般情況下,只有當(dāng)JVM處于運(yùn)行時(shí),這些對(duì)象才可能存在,即,這些對(duì)象的生命周期不會(huì)比JVM的生命周期更長(zhǎng)(即每個(gè)對(duì)象都在JVM中)但在現(xiàn)實(shí)應(yīng)用中,就可能要停止JVM運(yùn)行,但有要保存某些指定的對(duì)象,并在將來重新讀取被保存的對(duì)象。這是Java對(duì)象序列化就能夠?qū)崿F(xiàn)該功能。(可選擇入數(shù)據(jù)庫、或文件的形式保存)

(5)序列化對(duì)象的時(shí)候只是針對(duì)變量進(jìn)行序列化,不針對(duì)方法進(jìn)行序列化。(6)在Intent之間,基本的數(shù)據(jù)類型直接進(jìn)行相關(guān)傳遞即可,但是一旦數(shù)據(jù)類型比較復(fù)雜的時(shí)候,就需要進(jìn)行序列化操作了。

三. 如何選擇

? Serializable是通過I/O讀寫存儲(chǔ)在磁盤上的,使用反射機(jī)制,序列化過程較慢,且在序列化過程中創(chuàng)建許多臨時(shí)對(duì)象,容易觸發(fā)GC。Parcelable是直接在內(nèi)存中讀寫的,將一個(gè)完整的對(duì)象分解成Intent所支持的數(shù)據(jù)類型,不需要使用反射,所以Parcelable具有效率高,內(nèi)存開銷小的優(yōu)點(diǎn)。

? 在Android日常開發(fā)中,為了方便實(shí)現(xiàn)序列化只需在實(shí)體類中實(shí)現(xiàn)Serializable接口即可,而實(shí)現(xiàn)Parcelable接口,則需要重寫幾個(gè)方法,較于復(fù)雜了些,如:

data class UserInfoBean(
    @SerializedName("address")
    val address: String?,
    @SerializedName("city")
    val city: String?,
    @SerializedName("createTime")
    val createTime: Int,
    @SerializedName("district")
    val district: String?,
    @SerializedName("id")
    val id: Int,
    @SerializedName("loginName")
    val loginName: String?,
    @SerializedName("mail")
    val mail: String?,
    @SerializedName("merchantId")
    val merchantId: Int,
    @SerializedName("phone")
    val phone: String?,
    @SerializedName("province")
    val province: String?,
    @SerializedName("remark")
    val remark: String?,
    @SerializedName("status")
    val status: Int,
    @SerializedName("updateTime")
    val updateTime: Int,
    @SerializedName("userName")
    val userName: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readInt(),
        parcel.readString()
    )
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(address)
        parcel.writeString(city)
        parcel.writeInt(createTime)
        parcel.writeString(district)
        parcel.writeInt(id)
        parcel.writeString(loginName)
        parcel.writeString(mail)
        parcel.writeInt(merchantId)
        parcel.writeString(phone)
        parcel.writeString(province)
        parcel.writeString(remark)
        parcel.writeInt(status)
        parcel.writeInt(updateTime)
        parcel.writeString(userName)
    }
    override fun describeContents(): Int {
        return 0
    }
    companion object CREATOR : Parcelable.Creator<UserInfoBean> {
        override fun createFromParcel(parcel: Parcel): UserInfoBean {
            return UserInfoBean(parcel)
        }
        override fun newArray(size: Int): Array<UserInfoBean?> {
            return arrayOfNulls(size)
        }
    }
}

在Kotlin,實(shí)現(xiàn)Parcelable接口來序列化的復(fù)雜性已經(jīng)不復(fù)存在了,進(jìn)入主題,請(qǐng)看下文~

四. 進(jìn)入主題

升級(jí)Kotlin Gradle plugins和Android Studio plugin的版本在1.3.60以上,實(shí)現(xiàn)方式:

在模塊級(jí)的build.gradle中添加

apply plugin: 'kotlin-android-extensions'

android{
    androidExtensions {
        experimental = true
    }
}

在對(duì)象類中添加@Parcelize并實(shí)現(xiàn)Parcelable接口即可實(shí)現(xiàn)序列化(在低版本中可能存在警告忽略即可)。

? 由于在 Kotlin 1.4.20 中做了一個(gè)重要的更新,影響如下:

廢棄了 kotlin-android-extensions 編譯插件Parcelable 相關(guān)的功能,移到了新的插件 kotlin-parcelize

Kotlin Gradle plugins 升級(jí)到1.4.20以后,作以下修改:

// apply plugin: 'kotlin-android-extensions'
// 改為
apply plugin: 'kotlin-parcelize'

在實(shí)體類導(dǎo)包中將 import kotlinx.android.parcel.Parcelize 修改為import kotlinx.parcelize.Parcelize,但是這一步不是必須的,kotlinx.android.parcel.Parcelize 可以繼續(xù)使用,到目前為止還沒有發(fā)現(xiàn)什么問題(PS: 如果出現(xiàn)問題,只需要將包名替換就好)

到此這篇關(guān)于Kotlin注解實(shí)現(xiàn)Parcelable序列化流程詳解的文章就介紹到這了,更多相關(guān)Kotlin Parcelable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android拼接實(shí)現(xiàn)動(dòng)態(tài)對(duì)象方法詳解

    Android拼接實(shí)現(xiàn)動(dòng)態(tài)對(duì)象方法詳解

    這篇文章主要為大家介紹了Android拼接實(shí)現(xiàn)動(dòng)態(tài)對(duì)象方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • flutter升級(jí)3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決

    flutter升級(jí)3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決

    這篇文章主要介紹了flutter升級(jí)3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加
    2023-02-02
  • Android Handler實(shí)現(xiàn)閃屏頁倒計(jì)時(shí)代碼

    Android Handler實(shí)現(xiàn)閃屏頁倒計(jì)時(shí)代碼

    這篇文章主要介紹了Android Handler實(shí)現(xiàn)閃屏頁倒計(jì)時(shí)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 解析Android開發(fā)中多點(diǎn)觸摸的實(shí)現(xiàn)方法

    解析Android開發(fā)中多點(diǎn)觸摸的實(shí)現(xiàn)方法

    多點(diǎn)觸摸(MultiTouch),指的是允許計(jì)算機(jī)用戶同時(shí)通過多個(gè)手指來控制圖形界面的一種技術(shù)。與多點(diǎn)觸摸技術(shù)相對(duì)應(yīng)的就是單點(diǎn)觸摸,單點(diǎn)觸摸的設(shè)備已經(jīng)有很多年了,小尺寸的有觸摸式的手機(jī),大尺寸的最常見的就是銀行里的ATM機(jī)和排隊(duì)查詢機(jī)等等
    2013-05-05
  • Android性能優(yōu)化系列篇UI優(yōu)化

    Android性能優(yōu)化系列篇UI優(yōu)化

    這篇文章主要為大家介紹了Android性能優(yōu)化系列篇UI優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android學(xué)習(xí)教程之日歷庫使用(15)

    Android學(xué)習(xí)教程之日歷庫使用(15)

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之日歷庫使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android編程設(shè)置屏幕亮度的方法

    Android編程設(shè)置屏幕亮度的方法

    這篇文章主要介紹了Android編程設(shè)置屏幕亮度的方法,結(jié)合實(shí)例形式分析了Android獲取及設(shè)置屏幕亮度的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • Android實(shí)現(xiàn)左右滑動(dòng)效果的方法詳解

    Android實(shí)現(xiàn)左右滑動(dòng)效果的方法詳解

    本篇文章是對(duì)Android實(shí)現(xiàn)左右滑動(dòng)效果的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android自定義方框EditText注冊(cè)驗(yàn)證碼

    Android自定義方框EditText注冊(cè)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Android自定義方框EditText注冊(cè)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析

    Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析

    許多機(jī)友新購來的Android機(jī)器沒有破解過Root權(quán)限,無法使用一些需要高權(quán)限的軟件,以及進(jìn)行一些高權(quán)限的操作,其實(shí)破解手機(jī)Root權(quán)限是比較簡(jiǎn)單及安全的,破解Root權(quán)限的原理就是在手機(jī)的/system/bin/或/system/xbin/目錄下放置一個(gè)可執(zhí)行文件“su”
    2013-10-10

最新評(píng)論

新宾| 开化县| 罗甸县| 象州县| 安溪县| 金沙县| 宁德市| 麻城市| 宜兰县| 大渡口区| 肃宁县| 威远县| 曲周县| 晴隆县| 青浦区| 浦北县| 志丹县| 耒阳市| 大渡口区| 玛沁县| 吴江市| 临武县| 民乐县| 济阳县| 永丰县| 巴南区| 陇川县| 庄浪县| 得荣县| 荣成市| 东源县| 桐城市| 上杭县| 汝州市| 交城县| 阜城县| 昭平县| 会昌县| 温州市| 弥勒县| 临沧市|