什么是序列化狡赐?
把Java對(duì)象轉(zhuǎn)換為字節(jié)序列,并存儲(chǔ)至一個(gè)儲(chǔ)存媒介的過(guò)程盈魁。
什么是反序列化栏豺?
把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程彬碱。
簡(jiǎn)單說(shuō)法是:序列化把當(dāng)前對(duì)象信息保存下來(lái)。反序列化剛好相反的操作奥洼,即讀取信息設(shè)置到當(dāng)前對(duì)象上巷疼。
序列化作用
1)永久性保存對(duì)象,保存對(duì)象的字節(jié)序列到本地文件中灵奖;
2)通過(guò)序列化對(duì)象在網(wǎng)絡(luò)中傳遞對(duì)象嚼沿;
3)通過(guò)序列化在進(jìn)程間傳遞對(duì)象。
安卓里面的兩種序列化的方式:
Serializable 和 Parcelable 接口可以完成對(duì)象的序列化過(guò)程:
具體作用:
1桑寨、通過(guò)Intent 和 Binder 傳輸數(shù)據(jù)時(shí)就需要使用
2伏尼、需要將對(duì)象持久化到存儲(chǔ)設(shè)備上或者通過(guò)網(wǎng)絡(luò)傳輸給其他客戶端
兩者的區(qū)別
android上應(yīng)該盡量采用Parcelable,效率至上
編碼上:
Serializable代碼量少尉尾,寫起來(lái)方便
Parcelable代碼多一些
效率上:
Parcelable的速度比Serializable 高十倍以上
serializable的迷人之處在于你只需要對(duì)某個(gè)類以及它的屬性實(shí)現(xiàn)Serializable 接口即可爆阶。Serializable 接口是一種標(biāo)識(shí)接口(marker interface),這意味著無(wú)需實(shí)現(xiàn)方法沙咏,Java便會(huì)對(duì)這個(gè)對(duì)象進(jìn)行高效的序列化操作辨图。
這種方法的缺點(diǎn)是使用了反射,序列化的過(guò)程較慢肢藐。這種機(jī)制會(huì)在序列化的時(shí)候創(chuàng)建許多的臨時(shí)對(duì)象故河,容易觸發(fā)垃圾回收。
Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解吆豹,而分解后的每一部分都是Intent所支持的數(shù)據(jù)類型鱼的,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了
1)在使用內(nèi)存的時(shí)候,Parcelable比Serializable性能高痘煤,所以推薦使用Parcelable凑阶。
2)Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量,從而引起頻繁的GC衷快。
3)Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤上的情況宙橱,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下。盡管Serializable效率低點(diǎn),但此時(shí)還是建議使用Serializable师郑。
4)Serializable的實(shí)現(xiàn)环葵,只需要implements Serializable 即可。這只是給對(duì)象打了一個(gè)標(biāo)記宝冕,系統(tǒng)會(huì)自動(dòng)將其序列化张遭。
5)Parcelabel的實(shí)現(xiàn),不僅需要implements Parcelabel猬仁,還需要在類中添加一個(gè)靜態(tài)成員變量CREATOR帝璧,這個(gè)變量需要實(shí)現(xiàn) Parcelable.Creator 接口。
6) Parcelable的性能比Serializable好湿刽,在內(nèi)存開(kāi)銷方面較小的烁,所以在內(nèi)存間數(shù)據(jù)傳輸時(shí)推薦使用Parcelable,如activity間傳輸數(shù)據(jù)诈闺,而Serializable可將數(shù)據(jù)持久化方便保存渴庆,所以在需要保存或網(wǎng)絡(luò)傳輸數(shù)據(jù)時(shí)選擇Serializable,因?yàn)閍ndroid不同版本Parcelable可能不同雅镊,所以不推薦使用Parcelable進(jìn)行數(shù)據(jù)持久化