重度拖延癥患者來了- 馆衔。-
Serializable接口
類實(shí)現(xiàn)Serializable接口時(shí)辛慰,類的申明中指定serialVersionUID作用:序列化時(shí)會將當(dāng)前類serialVersionUID寫入追他,反序列化時(shí)會檢測序列化時(shí)的serialVersionUID,看是否和當(dāng)前類一致踊东,若一致产徊,反序列化成功。
若不手動指定serialVersionUID的值井赌,序列化時(shí)會根據(jù)當(dāng)前類的結(jié)構(gòu)自動生成hash值谤逼,這樣序列化反序列化時(shí)serialVersionUID一致也可以正常反序列化。
但是當(dāng)不手動指定仇穗,反序列化時(shí)當(dāng)前類結(jié)構(gòu)發(fā)生變化流部,增加或刪除了某些成員變量,此時(shí)當(dāng)前類的hash重新計(jì)算導(dǎo)致當(dāng)前類serialVersionUID發(fā)生變化纹坐,和序列化的數(shù)據(jù)中serialVersionUID不一致因而反序列化失敗枝冀。
若手動指定serialVersionUID值,即便序列化后當(dāng)前類增加或刪除了某些成員變量類結(jié)構(gòu)發(fā)生了變化耘子,但serialVersionUID值不變?nèi)阅艹晒Ψ葱蛄谢绦蚰茏畲笙薅鹊幕謴?fù)數(shù)據(jù)。但是某些非常規(guī)改變還是會導(dǎo)致失敗谷誓,如改變類名绒障、修改成員變量類型。
靜態(tài)成員變量屬于類不屬于對象捍歪,不會參與序列化過程户辱;用transient關(guān)鍵字標(biāo)記的成員變量也不參與序列化過程。
Parcelable接口
Parcel內(nèi)部包裝了可序列化的數(shù)據(jù)糙臼,可在Binder中自由傳輸庐镐。Parcelable接口實(shí)現(xiàn)序列化過程中需要實(shí)現(xiàn)的功能有:序列化(writeToParcel)、反序列化(CREATOR)变逃、內(nèi)容描述(describeContents)焚鹊。
Serializable、Parcelable區(qū)別
Serializable是Java中的序列化接口,使用起來開銷大末患,序列化和反序列化過程需要大量的I/O操作研叫;
Parcelable是Android中的序列化方式,更適合Android平臺上使用璧针,缺點(diǎn)是麻煩(現(xiàn)在AS可直接集成)嚷炉,但效率高;Android推薦的序列化方式探橱,首選Parcelable申屹;
但是將對象序列化到存儲設(shè)備或?qū)ο笮蛄谢笸ㄟ^網(wǎng)絡(luò)傳輸,使用Parcelable也可以實(shí)現(xiàn)隧膏,但過程會稍顯復(fù)雜哗讥,這兩種情況建議使用Serializable。