日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Kotlin注解實現Parcelable序列化流程詳解_Android

作者:cdAndroid ? 更新時間: 2023-01-12 編程語言

一. 概念介紹

1. 序列化

? 由于存在于內存中的對象都是暫時的,無法長期駐存,為了把對象的狀態保持下來,這時需要把對象寫入到磁盤或者其他介質中,這個過程就叫做序列化。

2. 反序列化

? 反序列化恰恰是序列化的反向操作,也就是說,把已存在在磁盤或者其他介質中的對象,反序列化(讀取)到內存中,以便后續操作,而這個過程就叫做反序列化。

3. 實現序列化的條件

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

二. 序列化目的

(1)永久的保存對象數據(將對象數據保存在文件當中,或者是磁盤中)

(2)通過序列化操作將對象數據在網絡上進行傳輸(由于網絡傳輸是以字節流的方式對數據進行傳輸的。因此序列化的目的是將對象數據轉換成字節流的形式)

(3)將對象數據在進程之間進行傳遞(Activity之間傳遞對象數據時,需要在當前的Activity中對對象數據進行序列化操作。在另一個Activity中需要進行反序列化操作講數據取出)

(4)Java允許我們在內存中創建可復用的Java對象,但一般情況下,只有當JVM處于運行時,這些對象才可能存在,即,這些對象的生命周期不會比JVM的生命周期更長(即每個對象都在JVM中)但在現實應用中,就可能要停止JVM運行,但有要保存某些指定的對象,并在將來重新讀取被保存的對象。這是Java對象序列化就能夠實現該功能。(可選擇入數據庫、或文件的形式保存)

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

三. 如何選擇

? Serializable是通過I/O讀寫存儲在磁盤上的,使用反射機制,序列化過程較慢,且在序列化過程中創建許多臨時對象,容易觸發GC。Parcelable是直接在內存中讀寫的,將一個完整的對象分解成Intent所支持的數據類型,不需要使用反射,所以Parcelable具有效率高,內存開銷小的優點。

? 在Android日常開發中,為了方便實現序列化只需在實體類中實現Serializable接口即可,而實現Parcelable接口,則需要重寫幾個方法,較于復雜了些,如:

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,實現Parcelable接口來序列化的復雜性已經不復存在了,進入主題,請看下文~

四. 進入主題

升級Kotlin Gradle plugins和Android Studio plugin的版本在1.3.60以上,實現方式:

在模塊級的build.gradle中添加

apply plugin: 'kotlin-android-extensions'

android{
? ? androidExtensions {
? ? ? ? experimental = true
? ? }
}

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

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

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

Kotlin Gradle plugins 升級到1.4.20以后,作以下修改:

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

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

原文鏈接:https://blog.csdn.net/weixin_44352679/article/details/111950256

欄目分類
最近更新