安卓序列化方式

安卓中,Serializable和Parcelable傳遞對象的區(qū)別(這里只指使用 Binder 跨進(jìn)程傳遞對象),Binder 傳遞數(shù)據(jù),要通過在Binder的onTransact和transact方法里,通過 Parcel 對象傳遞,而Parcel對象,只支持傳遞幾種基本類型(與java基本數(shù)據(jù)類型有些差異,但請忽略這些細(xì)節(jié),后面統(tǒng)稱基本類型)。

對象發(fā)送時

  • Parcelable使用者將組成對象的成員變量全部細(xì)化成基礎(chǔ)數(shù)據(jù)類型,通過Parcel進(jìn)而使用Binder傳遞,也就是如果成員變量不是基本類型,其也要實現(xiàn)Parcelable,直到全部都是基本類型,其傳遞的變量選擇由使用者手動控制,所以其實現(xiàn)也更麻煩,這個過程就是程序員用Parcel往Binder裝數(shù)據(jù)。
  • 而Serializable要先用流將整個對象轉(zhuǎn)為byte數(shù)組,再用Binder將這個byte數(shù)組作為基本類型傳遞,這個過程由Parcel封裝,所以其使用簡單,不需要手寫代碼往Parcel里面裝數(shù)據(jù),Parcel封裝了將Serializable對象序列化成byte數(shù)組的過程。

對象接收時

  • Parcelable 可以根據(jù)使用者的定義來創(chuàng)建對象,可以直接使用構(gòu)造函數(shù)創(chuàng)建(在Creator的createFromParcel),用Parcel從Binder中取出數(shù)據(jù)來初始化這個對象。
  • Serializable 對象接收時是把Binder傳遞過來的byte數(shù)組通過流轉(zhuǎn)為對象,這個過程也是Parcel封裝的,其消耗更大,但使用者代碼量很少(幾乎什么都不用寫)。

簡單的來說,Parcelable對象發(fā)送時,由使用者將要傳遞的數(shù)據(jù)寫進(jìn)Parcel對象再傳遞至Binder中,對象接收時,使用者用 Parcel 從 Binder 中取值,完成對象的創(chuàng)建以及成員變量的賦值,使用者要清楚自己寫值和取值的順序。

Serializable 對象發(fā)送時,使用者只需要實現(xiàn) Serializable 接口,因為 Binder 只傳遞基本類型,Parcel 先將Serializable 對象序列化,整個轉(zhuǎn)為 byte 數(shù)組,然后通過 Binder 傳遞。對象接收時,通過 Parcel 從 Binder 讀出 byte 數(shù)組,再反序列化成對象,這個過程也是 Parcel 封裝的,所以使用者幾乎什么都不用做。


異同

  • 兩者數(shù)據(jù)都要用 Binder 傳遞,接收對象時其實還都要用到反射(用Parcelable只是有可能用到反射,在androidstudio 生成的parcelable實現(xiàn)中,對于對象反序列化時拿T.CREATOR 對象其實用到反射拿到的,盡管這不是必須的)
  • Parcelable 的使用由程序員從對象抽出數(shù)據(jù)寫入 Binder,在 Binder 另一端將零散的數(shù)據(jù)再組合成對象,而Serializable 由 Parcel 完成整個對象數(shù)據(jù)的打包,打包成一個 byte 數(shù)組,再在 Binder 的另一端解包再合成對象,所以使用者只操作對象而不具體操作數(shù)據(jù)。

Binder 讀寫數(shù)據(jù)的兩個過程中,Serializable 用到的中間對象更多,浪費的空間更多,傳遞的數(shù)據(jù)更大,浪費的時間也更多,但 Serializable 的好處,就是使用更簡單,而且可以脫離 Binder 使用,比如可以存對象到文件,或用 socket 傳遞對象,而 Parcelable 是完全依賴 Binder 的,Binder 負(fù)責(zé)數(shù)據(jù)的傳遞,而數(shù)據(jù)的提取和組合是使用者完成的,當(dāng)然,現(xiàn)在這些工作可以由插件工具一鍵生成,但這就是在代碼編寫階段的事情了(其實要想利用其他傳輸機(jī)制實現(xiàn) Parcelable 對象傳遞也是可以的,只要你能為其他機(jī)制實現(xiàn)一個擁有Parcel相同能力的類),

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 阿伯初來到鎮(zhèn)上的時候,天空飄著牛毛細(xì)雨。偉大的土地媽媽,在進(jìn)行朝圣的洗禮。溝壑里雨水匯聚成一股黃流,在泥土的指...
    時以芩閱讀 276評論 0 0
  • 假期,江蘇衛(wèi)視的《一站到底》世界名校學(xué)子爭霸賽正熱播,看到本季冠軍站隊和去年冠軍站隊,強(qiáng)強(qiáng)對決的那一集時,除了感受...
    素秋微菊閱讀 410評論 0 3
  • 最近不知道怎么了,心情莫名的不好 不想和任何人說話,只想自己一個人靜靜的發(fā)呆 心里悶的發(fā)慌,想拼命的尋找一個出口 ...
    泰國姑娘在北京閱讀 228評論 0 0
  • 9月19日 蘭州乘車西寧轉(zhuǎn)車,終于坐上進(jìn)藏列車。一夜昏昏沉沉,似睡非睡…… 清晨火車開始翻越昆侖山,因昨晚下雪大地...
    zhanglun閱讀 472評論 0 0

友情鏈接更多精彩內(nèi)容