1.Android中實(shí)現(xiàn)序列化有兩個(gè)選擇:
一是實(shí)現(xiàn)Serializable接口(是JavaSE本身支持的),另外一種是實(shí)現(xiàn)Parcelable接口(效率比Serializable高,是Android特有的,用于Intent傳遞數(shù)據(jù),也可用于進(jìn)程間通信)。
2.那么為什么需要序列化呀?
a)Serializable的作用是為了保存對(duì)象的屬性到本地文件、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)流、rmi以方便數(shù)據(jù)傳輸,當(dāng)然這種傳輸可以是程序內(nèi)的也可以是兩個(gè)程序間的.例如Intent需要傳遞一個(gè)對(duì)象,就用Bundle .putSerializable(Key,Object)。前提是你這個(gè)對(duì)象implement了Serailizable。
b)Android的Parcelable的設(shè)計(jì)初衷是因?yàn)镾erializable效率過慢,為了在程序內(nèi)不同組件間以及不同Android程序間(AIDL)高效的傳輸數(shù)據(jù)而設(shè)計(jì),這些數(shù)據(jù)僅在內(nèi)存中存在,Parcelable是通過IBinder通信的消息的載體。例如Intent需要傳遞一個(gè)對(duì)象,就用Bundle .putParcelable(Key,Object)。前提是你這個(gè)對(duì)象implement了Parcelable。
3.兩者對(duì)比:
1)在使用內(nèi)存的時(shí)候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
2)Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量,從而引起頻繁的GC。
3)Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤上或網(wǎng)絡(luò)傳輸數(shù)據(jù)的情況,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下。因?yàn)閍ndroid不同版本Parcelable可能不同,所以不推薦使用Parcelable進(jìn)行數(shù)據(jù)持久化盡管Serializable效率低點(diǎn),但此時(shí)還是建議使用Serializable 。
4.代碼實(shí)現(xiàn)
實(shí)現(xiàn)Serializable接口非常簡(jiǎn)單,只需要implements Serializable就可以了,有些變量如果不需要序列化的話就加上transient聲明。

實(shí)現(xiàn)Parcelable接口略微有趣一些:
先看看Parcelable接口定義:

再介紹一下Parcel吧:

意思大概是Parcel是一個(gè)在序列化過程中的容器,可以write進(jìn)去,然后read出來,看不懂的妹子可以打電話或者微信視頻我。
實(shí)現(xiàn)Parcelable步驟:
1.在WriteToParcel方法中寫入自己需要的變量

2.創(chuàng)建私有的構(gòu)造方法,按順序,按順序,按順序,把變量讀出來

實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR實(shí)現(xiàn)接口Parcelable.Creator
注:其中public static final一個(gè)都不能少,內(nèi)部對(duì)象CREATOR的名稱也不能改變,必須全部大寫。需重寫本接口中的兩個(gè)方法:createFromParcel(Parcel in) 實(shí)現(xiàn)從Parcel容器中讀取傳遞數(shù)據(jù)值,封裝成Parcelable對(duì)象返回邏輯層,newArray(int size) 創(chuàng)建一個(gè)類型為T,長(zhǎng)度為size的數(shù)組,僅一句話即可(return new T[size]),供外部類反序列化本類數(shù)組使用。
