<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於存在於記憶體中的物件都是暫時的,無法長期駐存,為了把物件的狀態保持下來,這時需要把物件寫入到磁碟或者其他媒介中,這個過程就叫做序列化。
反序列化恰恰是序列化的反向操作,也就是說,把已存在在磁碟或者其他媒介中的物件,反序列化(讀取)到記憶體中,以便後續操作,而這個過程就叫做反序列化。
在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: 如果出現問題,只需要將包名替換就好)
到此這篇關於Kotlin註解實現Parcelable序列化流程詳解的文章就介紹到這了,更多相關Kotlin Parcelable內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45