1、Parcelable和Serializable有什么用罐寨,它們有什么差別料身?
作用:
Serializable是Java所提供的一個(gè)序列化接口,它是一個(gè)空接口衩茸,為對(duì)象提供標(biāo)準(zhǔn)的序列化和反序列化操作芹血。它的作用是為了保存對(duì)象的屬性到本地文件、數(shù)據(jù)庫(kù)楞慈、網(wǎng)絡(luò)流幔烛、rmi以方便數(shù)據(jù)傳輸,當(dāng)然這種傳輸可以是程序內(nèi)的也可以是兩個(gè)程序間的囊蓝。
而Android的Parcelable的設(shè)計(jì)初衷是因?yàn)镾erializable效率過(guò)慢饿悬,為了在程序內(nèi)不同組件間以及不同Android程序間(AIDL)高效的傳輸數(shù)據(jù)而設(shè)計(jì),這些數(shù)據(jù)僅在內(nèi)存中存在聚霜,Parcelable是通過(guò)IBinder通信的消息的載體狡恬。
區(qū)別
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 庸追。
2霍骄、自定義一個(gè)類讓其實(shí)現(xiàn)Parcelable,大致流程是什么?
例如自定義實(shí)體類PersonBean 淡溯,實(shí)現(xiàn)Parcelable接口
1).復(fù)寫writeToParcel 將對(duì)象數(shù)據(jù)序列化成一個(gè)Parcel對(duì)象(序列化之后成為Parcel對(duì)象.以便Parcel容器取出數(shù)據(jù)读整,其中flags標(biāo)識(shí)有兩種值:0或1。為1時(shí)標(biāo)識(shí)當(dāng)前對(duì)象需要作為返回值返回咱娶,不能立刻釋放資源绘沉,即PARCELABLE_WRITE_RETURN_VALUE,不過(guò)幾乎所有情況都返回0)豺总;
2).復(fù)寫describeContents方法,默認(rèn)值為0(返回當(dāng)前對(duì)象的內(nèi)存描述车伞。如果含有文件描述符,返回1 即CONTENTS_FILE_DESCRIPTOR喻喳,否則返回0另玖,幾乎所有情況都返回0);
3).實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR表伦,實(shí)現(xiàn)接口Parcelable.Creator 谦去。
示例:
public class PersonBean implements Parcelable {
private String name;
private String age;
//從序列化后的對(duì)象中創(chuàng)建原始對(duì)象
protected PersonBean(Parcel in) {
name = in.readString();
age = in.readString();
}
//將Parcel容器中的數(shù)據(jù)轉(zhuǎn)換成對(duì)象數(shù)據(jù)
public static final Creator<PersonBean> CREATOR = new Creator<PersonBean>() {
//從序列化后的對(duì)象中創(chuàng)建原始對(duì)象
//從Parcel容器中取出數(shù)據(jù)并進(jìn)行轉(zhuǎn)換
@Override
public PersonBean createFromParcel(Parcel in) {
return new PersonBean(in);
}
//創(chuàng)建指定長(zhǎng)度的原始對(duì)象數(shù)組
//返回對(duì)象數(shù)據(jù)的大小
@Override
public PersonBean[] newArray(int size) {
return new PersonBean[size];
}
};
//返回當(dāng)前對(duì)象的內(nèi)存描述。如果含有文件描述符蹦哼,返回1 即CONTENTS_FILE_DESCRIPTOR鳄哭,
//否則返回0
//幾乎所有情況都返回0
@Override
public int describeContents() {
return 0;
}
//將當(dāng)前對(duì)象寫入序列化結(jié)構(gòu)中,其中flags標(biāo)識(shí)有兩種值:0或1
//為1時(shí)標(biāo)識(shí)當(dāng)前對(duì)象需要作為返回值返回纲熏,不能立刻釋放資源妆丘,即PARCELABLE_WRITE_RETURN_VALUE
//不過(guò)幾乎所有情況都返回0
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(age);
}
}