Android 序列化之 Parcelable v.s. Serializable

Wayne Chen
AppWorks School
Published in
Apr 7, 2021

什麼是序列化?為什麼要序列化?怎麼去實作序列化?本篇將說明關於兩種序列化的一些差異以及如何實作。

序列化是什麼?

序列化就是將非基本型別的對象,轉換為二進位資料,進而達到可傳輸、可儲存的狀態。

在 Android 開發中,Activity 之間、Fragment 之間、APP 之間的資料傳遞,都只支援基本型態,所以我們必須透過將對象序列化,讓序列化後的對象可用於資料傳遞。

Android 中的序列化

在 Android 中的序列化有兩種:SerializableParcelable

Serializable 是 Java 內建的機制、而 Parcelable 是 Android 提供的接口。

在效能的比較上,因為 Serializable 會有頻繁的 IO 操作,所以消耗會較大,但是在實作接口時相對容易。Parcelable 效率上是比較好的,但在實作接口時必須將序列化、反序列化相關方法實作出來,所以實作起來相對複雜。

實作 Serializable

就如同我們上面講過的,實作 Serializable 相對容易,只要將物件實作 Serializable 接口即可。

接下來即可用於資料傳遞的使用

實作 Parcelable

與實作 Serializable 不同,實作 Parcelable 相對複雜,必須在物件實作 Parcelable 接口後,覆寫 writeToParcel 方法以及創建 Parcelable.Creator 進而覆寫 createFromParcel 方法。

writeToParcel 方法:在序列化的時候,將資料寫入 Parcel。

createFromParcel 方法:在反序列化的時候,從 Parcel 取得資料後存進物件並回傳,這邊需要注意存取的參數順序的一致性。

接下來即可用於資料傳遞的使用

結論

Serializable

  • 實作相對簡單
  • 會有頻繁的 IO 操作,存取速度較慢、資源消耗較大
  • 建議使用在外部空間存取,達到永久性儲存

Parcelable

  • 實作相對複雜
  • 存取速度較快、消耗資源較少
  • 建議使用在內存存取,使用在外部空間存取做永久性儲存的話,可能會因 Android 不同版本間的 Parcelable 導致差異性

--

--