序列化:將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)心俗,序列化后的對(duì)象可以在網(wǎng)絡(luò)上傳輸吠勘,也 可以存儲(chǔ)到本地逸寓,或?qū)崿F(xiàn)跨進(jìn)程傳輸若治。
為什么要進(jìn)行序列化:開發(fā)過程中慨蓝,我們需要將對(duì)象的引用傳給其他 activity 或 fragment 使用時(shí),需要將這些對(duì)象放到一個(gè) Intent 或 Bundle 中端幼,再進(jìn)行傳遞礼烈,而 Intent 或 Bundle 只能識(shí)別基本數(shù)據(jù)類型和被序列化的類型。
Serializable:表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)婆跑。
Parcelable:與 Serializable 實(shí)現(xiàn)的效果相同此熬,也是將一個(gè)對(duì)象轉(zhuǎn)換成可傳輸?shù)臓顟B(tài),但它的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,分解后的每一部分都是 Intent 所支持的數(shù)據(jù)類型犀忱,這樣實(shí)現(xiàn)傳遞對(duì)象的功能疟赊。
Parcelable 實(shí)現(xiàn)序列化的重要方法:序列化功能是由 writeToParcel 完成,通過 Parcel 中的 write 方法來完成峡碉;反序列化由 CREATOR 完成,內(nèi)部標(biāo)明了如何創(chuàng)建序列化對(duì)象及數(shù)級(jí)驮审, 通過 Parcel 的 read 方法完成鲫寄;內(nèi)容描述功能由 describeContents 方法完成,一般直接返回0疯淫。
區(qū)別:Serializable 在序列化時(shí)會(huì)產(chǎn)生大量臨時(shí)變量地来,引起頻繁 GC。Serializable 本質(zhì)上使用了反射熙掺,序列化過程慢未斑。Parcelable 不能將數(shù)據(jù)存儲(chǔ)在磁盤上,在外界變化時(shí)币绩,它不能很好的保證數(shù)據(jù)的持續(xù)性蜡秽。
選擇原則:若僅在內(nèi)存中使用,如 activity/service 間傳遞對(duì)象缆镣,優(yōu)先使用 Parcelable芽突,它性能高。若是持久化操作董瞻,優(yōu)先使用 Serializable 寞蚌。
注意:靜態(tài)成員變量屬于類,不屬于對(duì)象钠糊,固不會(huì)參與序列化的過程挟秤;用 transient 關(guān)鍵字編輯的成員變量不會(huì)參與序列化過程;可以通過重寫 writeObject()和 readObject()方法來 重寫系統(tǒng)默認(rèn)的序列化和反序列化抄伍。