網站首頁 編程語言 正文
一. 概念介紹
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
相關推薦
- 2022-02-28 CommonsChunkPlugin 插件使用方法 、 出現報錯 : Error: webpa
- 2022-01-20 關于 Symbol() 能不能當作 key值使用
- 2022-12-12 Python中函數帶括號和不帶括號的區別及說明_python
- 2022-09-08 C++實現Dijkstra算法的示例代碼_C 語言
- 2023-01-05 python?如何去除字符串中指定字符_python
- 2023-01-03 Nginx?Gunicorn?flask項目部署思路分析詳解_nginx
- 2022-07-07 Python筆記之a?=?[0]*x格式的含義及說明_python
- 2022-07-11 SpringBoot事件機制@EventListener的簡單使用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支