在開發中,如果有需要用到序列化和反序列化的操作,就會用到 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 外掛中,已經自動包含了一個自動 Parcelable 實現生成器。簡單來說,只需要再主函式中,宣告序列化的屬性並新增一個 @Parcelize
註解,它將自動為我們建立 writeToParcel()
和 createFromParcel()
。也就是對開發者而言,只需要加一個 @Parcelize
註解,其他的和正常的類沒有區別。
二、使用 Parcelize
2.1 常規使用 Parcelable
在 Kotlin 沒有支援 @Parcelize
的時候,我們使用 Parcelable 的話,寫的 Model 類,大概是這樣的。
2.2 使用 @Parcelize
而如果使用了 @Parcelize
的話,這些模板程式碼都是會幫我們自動生成,我們只需要增加一個 @Parcelize
註解就好了。
有沒有感覺到程式碼量的減少?
2.3 實際上生成的程式碼
這兩個類,編譯完以後,實際上是一致的。我們這邊反編譯之後,看看 UserParcelize()
的程式碼。
@Parcelize
註解實際上就是幫我們自動生成了 writeToParcel()
和 createFromParcel()
,其實並沒有什麼高深的地方,但是這一點可以節約我們的程式碼量。
三、前期配置
@Parcelize
使用起來確實非常的方便,但是在此之前,我們還要進行一些簡單的配置。
3.1 Kotlin 版本
前面提到,@Parcelize
是需要 Kotlin 1.1.4 之上的版本才支援,所以你需要保證你的 Kotlin 版本為最新的就好了。升級 Kotlin 如前文所述,直接升級 Kotlin 外掛即可。升級完成之後,你可以在 Preferences 中,通過 Kotlin Compiler 檢視當前支援的版本,我這裡使用的是 1.2 版本。
3.2 Gradle 配置
@Parcelize
是一個實驗室功能,所以還需要在 Gradle 中,增加 experimental 配置。
3.3 解決 Lint 錯誤
直接使用 @Parcelize
你將面臨一個 Lint 的錯誤提示。當然 AS 已經為我們做出瞭解決它的提示。
只需要增加 @SuppressLint("ParcelCreator")
就可以忽略它就可以了。
今天的 Kotlin 小技巧,對你有沒有幫助?有什麼想法可以在留言區討論。
今天在承香墨影公眾號的後臺,回覆『成長』。我會送你一些我整理的學習資料,包含:Android反編譯、演算法、設計模式、虛擬機器、Linux、Kotlin、Python、爬蟲、Web專案原始碼。
推薦閱讀: