Kotlin注解實(shí)現(xiàn)Parcelable序列化流程詳解
一. 概念介紹
1. 序列化
? 由于存在于內(nèi)存中的對象都是暫時(shí)的,無法長期駐存,為了把對象的狀態(tài)保持下來,這時(shí)需要把對象寫入到磁盤或者其他介質(zhì)中,這個(gè)過程就叫做序列化。
2. 反序列化
? 反序列化恰恰是序列化的反向操作,也就是說,把已存在在磁盤或者其他介質(zhì)中的對象,反序列化(讀取)到內(nèi)存中,以便后續(xù)操作,而這個(gè)過程就叫做反序列化。
3. 實(shí)現(xiàn)序列化的條件
? 在Java中,一個(gè)對象要實(shí)現(xiàn)序列化操作,該類就必須實(shí)現(xiàn)了Serializable接口或者Parcelable接口,而Parcelable接口則是Android中特有的序列化接口。只要清楚知道實(shí)現(xiàn)序列化操作時(shí)必須實(shí)現(xiàn)Serializable接口或者Parcelable接口之一即可。
二. 序列化目的
(1)永久的保存對象數(shù)據(jù)(將對象數(shù)據(jù)保存在文件當(dāng)中,或者是磁盤中)
(2)通過序列化操作將對象數(shù)據(jù)在網(wǎng)絡(luò)上進(jìn)行傳輸(由于網(wǎng)絡(luò)傳輸是以字節(jié)流的方式對數(shù)據(jù)進(jìn)行傳輸?shù)?。因此序列化的目的是將對象?shù)據(jù)轉(zhuǎn)換成字節(jié)流的形式)
(3)將對象數(shù)據(jù)在進(jìn)程之間進(jìn)行傳遞(Activity之間傳遞對象數(shù)據(jù)時(shí),需要在當(dāng)前的Activity中對對象數(shù)據(jù)進(jìn)行序列化操作。在另一個(gè)Activity中需要進(jìn)行反序列化操作講數(shù)據(jù)取出)
(4)Java允許我們在內(nèi)存中創(chuàng)建可復(fù)用的Java對象,但一般情況下,只有當(dāng)JVM處于運(yùn)行時(shí),這些對象才可能存在,即,這些對象的生命周期不會比JVM的生命周期更長(即每個(gè)對象都在JVM中)但在現(xiàn)實(shí)應(yīng)用中,就可能要停止JVM運(yùn)行,但有要保存某些指定的對象,并在將來重新讀取被保存的對象。這是Java對象序列化就能夠?qū)崿F(xiàn)該功能。(可選擇入數(shù)據(jù)庫、或文件的形式保存)
(5)序列化對象的時(shí)候只是針對變量進(jìn)行序列化,不針對方法進(jìn)行序列化。(6)在Intent之間,基本的數(shù)據(jù)類型直接進(jìn)行相關(guān)傳遞即可,但是一旦數(shù)據(jù)類型比較復(fù)雜的時(shí)候,就需要進(jìn)行序列化操作了。
三. 如何選擇
? Serializable是通過I/O讀寫存儲在磁盤上的,使用反射機(jī)制,序列化過程較慢,且在序列化過程中創(chuàng)建許多臨時(shí)對象,容易觸發(fā)GC。Parcelable是直接在內(nèi)存中讀寫的,將一個(gè)完整的對象分解成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)入主題,請看下文~
四. 進(jìn)入主題
升級Kotlin Gradle plugins和Android Studio plugin的版本在1.3.60以上,實(shí)現(xiàn)方式:
在模塊級的build.gradle
中添加
apply plugin: 'kotlin-android-extensions'
android{
androidExtensions {
experimental = true
}
}
在對象類中添加@Parcelize
并實(shí)現(xiàn)Parcelable接口即可實(shí)現(xiàn)序列化(在低版本中可能存在警告忽略即可)。
? 由于在 Kotlin 1.4.20 中做了一個(gè)重要的更新,影響如下:
廢棄了 kotlin-android-extensions 編譯插件Parcelable 相關(guān)的功能,移到了新的插件 kotlin-parcelize
Kotlin Gradle plugins 升級到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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)實(shí)例之登錄界面的實(shí)現(xiàn)
本文主要介紹Android 登錄界面實(shí)現(xiàn),這里主要講解類似Twitter的登錄界面的實(shí)現(xiàn),有興趣的小伙伴可以參考下2016-08-08Android使用DatePickerDialog顯示時(shí)間
本文將結(jié)合實(shí)例代碼,介紹Android使用DatePickerDialog顯示時(shí)間,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Android開發(fā)使用Message對象分發(fā)必備知識點(diǎn)詳解
這篇文章主要為大家介紹了Android開發(fā)使用Message對象分發(fā)必備知識點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10接口對象的實(shí)例化在接口回調(diào)中的使用方法
下面小編就為大家?guī)硪黄涌趯ο蟮膶?shí)例化在接口回調(diào)中的使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02android app進(jìn)行代碼混淆實(shí)例詳解
本文主要節(jié)誒是android app進(jìn)行代碼混淆,這里整理了詳細(xì)的資料,及實(shí)現(xiàn)代碼,有興趣的小伙伴可以參考下2016-09-09Android 動態(tài)添加view或item并獲取數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)硪黄狝ndroid 動態(tài)添加view或item并獲取數(shù)據(jù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Android開發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫入存儲卡的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫入存儲卡的方法,涉及Android文件與目錄的讀取、寫入、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10