一饼疙、簡介:
android 中自定義的對象序列化的問題有兩個選擇一個是Parcelable,另外一個是Serializable。
序列化原因:
1.永久性保存對象忱屑,保存對象的字節(jié)序列到本地文件中波丰;
2.通過序列化對象在網(wǎng)絡(luò)中傳遞對象壳坪;
3.通過序列化在進程間傳遞對象。
二掰烟、序列化爽蝴、反序列化是什么?
(1) 名詞解釋
對象的序列化 : 把Java對象轉(zhuǎn)換為字節(jié)序列并存儲至一個儲存媒介的過程纫骑。對象的反序列化:把字節(jié)序列恢復(fù)為Java對象的過程蝎亚。
(2) 序列化詳細(xì)解釋
對象的序列化涉及三個點關(guān)鍵點:Java對象、字節(jié)序列先馆、存儲发框。
Java對象的組成?Java對象包含變量與方法煤墙。但是序列與反序列化僅處理Java變量而不處理方法梅惯,序列與反序列化僅對數(shù)據(jù)進行處理宪拥。
什么是字符序列?字符序列是兩個詞铣减,字符是在計算機和電信領(lǐng)域中她君,字符(Character)是一個信息單位。數(shù)學(xué)上葫哗,序列是被排成一列的對象(或事件)缔刹。《字符-維基百科》 劣针, 《序列-維基百科》 說白了就是連續(xù)排列的多個字符的集合校镐。類似于1A165613246546
存儲字符序列需要保存到一個地方,可以是硬盤也可以是內(nèi)存酿秸。簡單說法是:序列化把當(dāng)前對象信息保存下來灭翔。反序列化剛好相反的操作。
三辣苏、Java對象與Java對象序列化的區(qū)別肝箱?
Java對象存在的前提必須在JVM運行期間存在,如果想在JVM非運行的情況下或者在其他機器JVM上獲取指定Java對象稀蟋,在現(xiàn)有Java對象的機制下都不可能完成煌张。
與Java對象不同的是,如果對Java對象執(zhí)行序列化操作退客,因為原理是把Java對象信息保存到存儲媒介骏融,所以可以在以上Java對象不可能存在的兩種情況下依然可以使用Java對象。
四萌狂、為什么要使用序列化档玻、反序列化?
根據(jù)以上對序列化茫藏、反序列化的理解误趴,這個疑問可以翻譯成,為什么需要把對象信息保存到存儲媒介中并之后讀取出來务傲?
因為開發(fā)中有在JVM非運行的情況下或者在其他機器JVM上獲取指定Java對象的需求凉当。
五、Android中Serializable與Parcelable區(qū)別售葡?
1看杭、兩種都是用于支持序列化、反序列化話操作挟伙,兩者最大的區(qū)別在于存儲媒介的不同楼雹,Serializable使用IO讀寫存儲在硬盤上,而Parcelable是直接在內(nèi)存中讀寫,很明顯內(nèi)存的讀寫速度通常大于IO讀寫烘豹,所以在Android中通常優(yōu)先選擇Parcelable瓜贾。
2、至于選取哪種可參考下面的原則:
1.)在使用內(nèi)存的時候携悯,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類筷笨。
2.)Serializable在序列化的時候會產(chǎn)生大量的臨時變量憔鬼,從而引起頻繁的GC。
3.)Parcelable不能使用在要將數(shù)據(jù)存儲在磁盤上的情況胃夏,因為Parcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下轴或。盡管Serializable效率低點, 也不提倡用仰禀,但在這種情況下照雁,還是建議你用Serializable 。
六答恶、實現(xiàn):
1饺蚊、 Serializable 的實現(xiàn),只需要繼承 implements Serializable 即可悬嗓。這只是給對象打了一個標(biāo)記污呼,系統(tǒng)會自動將其序列化。
2包竹、 Parcelabel 的實現(xiàn)燕酷,需要在類中添加一個靜態(tài)成員變量 CREATOR,這個變量需要繼承 Parcelable.Creator 接口周瞎。
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};