![179](https://i.iter01.com/images/58775b04fbacf1d6f6d57e67a04c2567a4b7929f744d3e4e8bc6da8a12814228.jpg)
在開發中,如果有需要用到序列化和反序列化的操作,就會用到 Serializable 或者 Parcelable,它們各有優缺點,會適用於不同的場景。
Serializable 的優點是實現簡單,你只需要實現一個 Serializable 介面,並不需要任何額外的程式碼,但是它的序列化和反序列化,實際上是使用反射做的,所以效率會略低,並且它會在序列化的過程中,會建立很多臨時變數,所以更容易觸發 GC。
Parcelable 需要開發者自己去實現序列化的規則,所以會增加程式碼量,正是因為規則確定,所以效率會提高很多,並且不容易觸發 GC。
在 Android 下,通常我會推薦使用 Parcelable ,但是它需要實現太多模板程式碼了。那麼,有沒有辦法讓它和 Serializable 一樣,只經過簡單的配置就達到我們序列化的需求呢?那就看看 Kotlin 新支援的 Parcelize 了。
一、Kotlin 的 Parcelize
Parcelize 是 Kotlin 在 1.1.4 中,新增加的功能。
如果你需要使用它,先要保證 Android Studio 對 Kotlin 的外掛已經升級到 1.1.4 之上的版本,現在的最新版是 1.2.10 ,我這裡剛升級了。
![kotlin-plugin](https://i.iter01.com/images/870d06ee34978e7791f4d8669f7712185841e393baddb11522ef33cdcee7fef6.jpg)
在新版的 Kotlin 外掛中,已經自動包含了一個自動 Parcelable 實現生成器。簡單來說,只需要再主函式中,宣告序列化的屬性並新增一個 @Parcelize
註解,它將自動為我們建立 writeToParcel()
和 createFromParcel()
。也就是對開發者而言,只需要加一個 @Parcelize
註解,其他的和正常的類沒有區別。
二、使用 Parcelize
2.1 常規使用 Parcelable
在 Kotlin 沒有支援 @Parcelize
的時候,我們使用 Parcelable 的話,寫的 Model 類,大概是這樣的。
![Parcelable-kotlin](https://i.iter01.com/images/d862b0898be4d2b79c10095b2f609ccd7cf8b952f7e795d033ab3cbe81f03f9d.jpg)
2.2 使用 @Parcelize
而如果使用了 @Parcelize
的話,這些模板程式碼都是會幫我們自動生成,我們只需要增加一個 @Parcelize
註解就好了。
![Parcelize-kotlin](https://i.iter01.com/images/18f3a4c49c198ad9ca851096a0391f4d6e190fda56f841a7462c8b058d75b6aa.jpg)
有沒有感覺到程式碼量的減少?
2.3 實際上生成的程式碼
這兩個類,編譯完以後,實際上是一致的。我們這邊反編譯之後,看看 UserParcelize()
的程式碼。
![jadx0](https://i.iter01.com/images/72d563c4ed6d0a6d788014152cd7ee32160be4016e073fc53af7032729842a90.jpg)
@Parcelize
註解實際上就是幫我們自動生成了 writeToParcel()
和 createFromParcel()
,其實並沒有什麼高深的地方,但是這一點可以節約我們的程式碼量。
三、前期配置
@Parcelize
使用起來確實非常的方便,但是在此之前,我們還要進行一些簡單的配置。
3.1 Kotlin 版本
前面提到,@Parcelize
是需要 Kotlin 1.1.4 之上的版本才支援,所以你需要保證你的 Kotlin 版本為最新的就好了。升級 Kotlin 如前文所述,直接升級 Kotlin 外掛即可。升級完成之後,你可以在 Preferences 中,通過 Kotlin Compiler 檢視當前支援的版本,我這裡使用的是 1.2 版本。
![kotlin-version](https://i.iter01.com/images/a31163005d429a8ac17f7ddab666e6b0d4a212f90854c82abf675d340f0368dd.jpg)
3.2 Gradle 配置
@Parcelize
是一個實驗室功能,所以還需要在 Gradle 中,增加 experimental 配置。
![gradle-conf](https://i.iter01.com/images/953d2a34fa0e9679e95e748f38f83dd6d9f807acca15772cab5e3257bc56ec0a.jpg)
3.3 解決 Lint 錯誤
直接使用 @Parcelize
你將面臨一個 Lint 的錯誤提示。當然 AS 已經為我們做出瞭解決它的提示。
![lint](https://i.iter01.com/images/1a9523c0ba22de4e96f832796bf68ec9840c4308662a6ab0bd3cd2f30826088b.jpg)
只需要增加 @SuppressLint("ParcelCreator")
就可以忽略它就可以了。
今天的 Kotlin 小技巧,對你有沒有幫助?有什麼想法可以在留言區討論。
今天在承香墨影公眾號的後臺,回覆『成長』。我會送你一些我整理的學習資料,包含:Android反編譯、演算法、設計模式、虛擬機器、Linux、Kotlin、Python、爬蟲、Web專案原始碼。
推薦閱讀:
- Drawable 的這些常用小技巧,提高開發效率!
- Android 軟鍵盤的顯示和隱藏,這樣操作就對了
- Android 反編譯利器,jadx 的高階技巧
- 關於如何編寫 Clean Code 的 6 個簡單技巧
- 手寫你的第一個 Dalvik 版的 HelloWorld !
![Kotlin 一個好用的新功能:Parcelize](https://i.iter01.com/images/adf488485c95d5b07bec469c955155d7344078ab114608b16a945d334fb11bd8.jpg)