在開發中,如果有需要用到序列化和反序列化的操作,就會用到 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項目源碼。
推薦閱讀:
- Drawable 的這些常用小技巧,提高開發效率!
- Android 軟鍵盤的顯示和隱藏,這樣操作就對了
- Android 反編譯利器,jadx 的高級技巧
- 關於如何編寫 Clean Code 的 6 個簡單技巧
- 手寫你的第一個 Dalvik 版的 HelloWorld !