在開發中,如果有需要用到序列化和反序列化的操作,就會用到 serializable 或者 parcelable,它們各有優缺點,會適用於不同的場景。
serializable 的優點是實現簡單,你只需要實現乙個 serializable 介面,並不需要任何額外的**,但是它的序列化和反序列化,實際上是使用反射做的,所以效率會略低,並且它會在序列化的過程中,會建立很多臨時變數,所以更容易觸發 gc。
parcelable 需要開發者自己去實現序列化的規則,所以會增加**量,正是因為規則確定,所以效率會提高很多,並且不容易觸發 gc。
在 android 下,通常我會推薦使用 parcelable ,但是它需要實現太多模板**了。那麼,有沒有辦法讓它和 serializable 一樣,只經過簡單的配置就達到我們序列化的需求呢?那就看看 kotlin 新支援的 parcelize 了。
parcelize 是 kotlin 在 1.1.4 中,新增加的功能。
如果你需要使用它,先要保證 android studio 對 kotlin 的外掛程式已經公升級到 1.1.4 之上的版本,現在的最新版是 1.2.10 ,我這裡剛公升級了。
在新版的 kotlin 外掛程式中,已經自動包含了乙個自動 parcelable 實現生成器。簡單來說,只需要再主函式中,宣告序列化的屬性並新增乙個@parcelize
註解,它將自動為我們建立writetoparcel()
和createfromparcel()
。也就是對開發者而言,只需要加乙個@parcelize
註解,其他的和正常的類沒有區別。
在 kotlin 沒有支援@parcelize
的時候,我們使用 parcelable 的話,寫的 model 類,大概是這樣的。
而如果使用了@parcelize
的話,這些模板**都是會幫我們自動生成,我們只需要增加乙個@parcelize
註解就好了。
有沒有感覺到**量的減少?
這兩個類,編譯完以後,實際上是一致的。我們這邊反編譯之後,看看userparcelize()
的**。
@parcelize
註解實際上就是幫我們自動生成了writetoparcel()
和createfromparcel()
,其實並沒有什麼高深的地方,但是這一點可以節約我們的**量。
@parcelize
使用起來確實非常的方便,但是在此之前,我們還要進行一些簡單的配置。
前面提到,@parcelize
是需要 kotlin 1.1.4 之上的版本才支援,所以你需要保證你的 kotlin 版本為最新的就好了。公升級 kotlin 如前文所述,直接公升級 kotlin 外掛程式即可。公升級完成之後,你可以在 preferences 中,通過 kotlin compiler 檢視當前支援的版本,我這裡使用的是 1.2 版本。
@parcelize
是乙個實驗室功能,所以還需要在 gradle 中,增加 experimental 配置。
直接使用@parcelize
你將面臨乙個 lint 的錯誤提示。當然 as 已經為我們做出了解決它的提示。
只需要增加@suppresslint("parcelcreator")
就可以忽略它就可以了。
今天在推薦閱讀:
Kotlin 乙個好用的新功能 Parcelize
在開發中,如果有需要用到序列化和反序列化的操作,就會用到 serializable 或者 parcelable,它們各有優缺點,會適用於不同的場景。serializable 的優點是實現簡單,你只需要實現乙個 serializable 介面,並不需要任何額外的 但是它的序列化和反序列化,實際上是使用...
如何高效的設計乙個新功能?
我從事過多年的概念設計,原型設計,測試到最終構建和部署應用程式的功能和api編寫的工作。根據我的經歷。很多次,我開發完乙個新的功能後,準備紀錄下來這個功能如何用。我會先介紹總結特徵的有用性,我會思考許多。有時寫作會很容易和流暢。有時我會寫到一半,不知道後面該如何寫了。連我自己都不知道,為什麼會發生這...
小記 為開源專案增加乙個新功能的開發歷程
本篇文章不是為了記開發流水賬,而是想把開發過程的遇到的問題以及解決思路和大家進行交流和學習。我是一名普普通通的 php 工程師,希望對初級開發同學有所幫助。具體的心得體會見文末的總結。本週,公司開發事務不多,無加班,於是開始構思新功能糾正英語專有名詞大小寫的實現。首先,面臨的第乙個問題是 英語專有名...