序列化之Serializable和Parcelable

重度拖延癥患者來(lái)了- 。-


Serializable接口

類實(shí)現(xiàn)Serializable接口時(shí),類的申明中指定serialVersionUID作用:序列化時(shí)會(huì)將當(dāng)前類serialVersionUID寫入,反序列化時(shí)會(huì)檢測(cè)序列化時(shí)的serialVersionUID,看是否和當(dāng)前類一致,若一致,反序列化成功。
若不手動(dòng)指定serialVersionUID的值,序列化時(shí)會(huì)根據(jù)當(dāng)前類的結(jié)構(gòu)自動(dòng)生成hash值,這樣序列化反序列化時(shí)serialVersionUID一致也可以正常反序列化。
但是當(dāng)不手動(dòng)指定,反序列化時(shí)當(dāng)前類結(jié)構(gòu)發(fā)生變化,增加或刪除了某些成員變量,此時(shí)當(dāng)前類的hash重新計(jì)算導(dǎo)致當(dāng)前類serialVersionUID發(fā)生變化,和序列化的數(shù)據(jù)中serialVersionUID不一致因而反序列化失敗。
若手動(dòng)指定serialVersionUID值,即便序列化后當(dāng)前類增加或刪除了某些成員變量類結(jié)構(gòu)發(fā)生了變化,但serialVersionUID值不變?nèi)阅艹晒Ψ葱蛄谢?,程序能最大限度的恢?fù)數(shù)據(jù)。但是某些非常規(guī)改變還是會(huì)導(dǎo)致失敗,如改變類名、修改成員變量類型。

靜態(tài)成員變量屬于類不屬于對(duì)象,不會(huì)參與序列化過(guò)程;用transient關(guān)鍵字標(biāo)記的成員變量也不參與序列化過(guò)程。

Parcelable接口

Parcel內(nèi)部包裝了可序列化的數(shù)據(jù),可在Binder中自由傳輸。Parcelable接口實(shí)現(xiàn)序列化過(guò)程中需要實(shí)現(xiàn)的功能有:序列化(writeToParcel)、反序列化(CREATOR)、內(nèi)容描述(describeContents)。

Serializable、Parcelable區(qū)別

Serializable是Java中的序列化接口,使用起來(lái)開(kāi)銷大,序列化和反序列化過(guò)程需要大量的I/O操作;
Parcelable是Android中的序列化方式,更適合Android平臺(tái)上使用,缺點(diǎn)是麻煩(現(xiàn)在AS可直接集成),但效率高;Android推薦的序列化方式,首選Parcelable;
但是將對(duì)象序列化到存儲(chǔ)設(shè)備或?qū)ο笮蛄谢笸ㄟ^(guò)網(wǎng)絡(luò)傳輸,使用Parcelable也可以實(shí)現(xiàn),但過(guò)程會(huì)稍顯復(fù)雜,這兩種情況建議使用Serializable。

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

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

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