Android每日一問筆記-Parcelable 爲什麼效率高於 Serializable?

基於https://www.wanandroid.com每日一問的筆記,做一些整理,方便自己進行查看和記憶。

原文鏈接:https://www.wanandroid.com/wenda/show/9002

爲什麼Parcelable的效率比Serializable高?

可以從設計目的和實現原理兩個方面分析

設計目的

  • Serializable是Java API,是一個通用的序列化機制,通過將文件保存到本地文件、網絡流等實現便數據的傳遞,這種數據傳遞不僅可以在單個程序中進行,也可以在兩個不同的程序中進行;Parcelable是Android SDK API,爲了在同個程序的不同組件之間和不同程序(AIDL)之間高效的傳輸數據,是通過IBinder通信的消息的載體。從設計目的上可以看出Parcelable就是爲了Android高效傳輸數據而生的。

實現原理

  • Serializable是通過I/O讀寫存儲在磁盤上的,使用反射機制,序列化過程較慢,且在序列化過程中創建許多臨時對象,容易觸發GC。Parcelable是直接在內存中讀寫的,自已實現封送和解封(marshalled &unmarshalled)操作,將一個完整的對象分解成Intent所支持的數據類型,不需要使用反射,所以Parcelable具有效率高,內存開銷小的優點。

Parcelable爲了效率損失了什麼

  • Serializable是通用的序列化機制的,將數據存儲在磁盤,可以做到有限持久化保存,文件的生命週期不受程序影響,Parcelable的序列化操作完全由底層實現,不同版本的Android是實現方式可能不相同,所以不能進行持久化存儲。

一個對象可以序列化的關鍵

  • 序列化是將一個對象從存儲態轉化成傳輸態的過程,把對象轉化成字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。
  • 在序列化時,對象的各屬性都必須是可序列化的,聲明爲static和transient類型的成員數據不能被序列化。
  • 並非所有的對象都可以序列化,,至於爲什麼不可以,有很多原因了,比如:
    • 安全方面的原因,比如一個對象擁有private,public等field,對於一個要傳輸的對象,比如寫到文件,或者進行rmi傳輸等等,在序列化進行傳輸的過程中,這個對象的private等域是不受保護的。
    • 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者保存,也無法對他們進行重新的資源分配,而且,也是沒有必要這樣實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章