Kotlin 一個好用的新功能:Parcelize

承香墨影發表於2019-02-14
179

在開發中,如果有需要用到序列化和反序列化的操作,就會用到 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

在新版的 Kotlin 外掛中,已經自動包含了一個自動 Parcelable 實現生成器。簡單來說,只需要再主函式中,宣告序列化的屬性並新增一個 @Parcelize 註解,它將自動為我們建立 writeToParcel()createFromParcel()。也就是對開發者而言,只需要加一個 @Parcelize 註解,其他的和正常的類沒有區別。

二、使用 Parcelize

2.1 常規使用 Parcelable

在 Kotlin 沒有支援 @Parcelize 的時候,我們使用 Parcelable 的話,寫的 Model 類,大概是這樣的。

Parcelable-kotlin

2.2 使用 @Parcelize

而如果使用了 @Parcelize 的話,這些模板程式碼都是會幫我們自動生成,我們只需要增加一個 @Parcelize 註解就好了。

Parcelize-kotlin

有沒有感覺到程式碼量的減少?

2.3 實際上生成的程式碼

這兩個類,編譯完以後,實際上是一致的。我們這邊反編譯之後,看看 UserParcelize() 的程式碼。

jadx0

@Parcelize 註解實際上就是幫我們自動生成了 writeToParcel()createFromParcel(),其實並沒有什麼高深的地方,但是這一點可以節約我們的程式碼量。

三、前期配置

@Parcelize 使用起來確實非常的方便,但是在此之前,我們還要進行一些簡單的配置。

3.1 Kotlin 版本

前面提到,@Parcelize 是需要 Kotlin 1.1.4 之上的版本才支援,所以你需要保證你的 Kotlin 版本為最新的就好了。升級 Kotlin 如前文所述,直接升級 Kotlin 外掛即可。升級完成之後,你可以在 Preferences 中,通過 Kotlin Compiler 檢視當前支援的版本,我這裡使用的是 1.2 版本。

kotlin-version

3.2 Gradle 配置

@Parcelize 是一個實驗室功能,所以還需要在 Gradle 中,增加 experimental 配置。

gradle-conf

3.3 解決 Lint 錯誤

直接使用 @Parcelize 你將面臨一個 Lint 的錯誤提示。當然 AS 已經為我們做出瞭解決它的提示。

lint

只需要增加 @SuppressLint("ParcelCreator") 就可以忽略它就可以了。

今天的 Kotlin 小技巧,對你有沒有幫助?有什麼想法可以在留言區討論。

今天在承香墨影公眾號的後臺,回覆『成長』。我會送你一些我整理的學習資料,包含:Android反編譯、演算法、設計模式、虛擬機器、Linux、Kotlin、Python、爬蟲、Web專案原始碼。

推薦閱讀:

Kotlin 一個好用的新功能:Parcelize

相關文章