簡單的來說就是:在Intent或Bundle中無法直接放對象,必須把對象序列化為二進(jìn)制流才行,傳輸完成后要進(jìn)行反序列化,重新從流變?yōu)閷ο蟆?/p>
進(jìn)行Android開發(fā)的時(shí)候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個(gè)Intent或者Bundle里面,然后再傳遞。簡單來說就是將對象轉(zhuǎn)換為可以傳輸?shù)亩M(jìn)制流(二進(jìn)制序列)的過程,這樣我們就可以通過序列化,轉(zhuǎn)化為可以在網(wǎng)絡(luò)傳輸或者保存到本地的流(序列),從而進(jìn)行傳輸數(shù)據(jù) ,那反序列化就是從二進(jìn)制流(序列)轉(zhuǎn)化為對象的過程.
Parcelable是Android為我們提供的序列化的接口,Parcelable相對于Serializable的使用相對復(fù)雜一些,但Parcelable的效率相對Serializable也高很多,這一直是Google工程師引以為傲的,有時(shí)間的可以看一下Parcelable和Serializable的效率對比 Parcelable vs Serializable 號稱快10倍的效率
用的時(shí)候要注意:
寫構(gòu)造方法的時(shí)候要寫參數(shù)為Parcel的情況
要實(shí)現(xiàn)序列化、反序列化、描述這三個(gè)功能
描述很簡單,沒有特殊情況就返回0,目的是添加注釋描述類
序列化要注意使用對于參數(shù)類型的write
用一個(gè)小例子說明一下:
public class People implements Parcelable {
private String mName;
private int mAge;
private boolean mGender;
private ArrayList<String> mJobs;
private Friend mFriend;
private ArrayList<Friend> mFriends= new ArrayList<>()
public People() {}
/**
* 描述
* 返回的是內(nèi)容的描述信息
* 只針對一些特殊的需要描述信息的對象,需要返回1,其他情況返回0就可以
*
* @return
*/
@Override
public int describeContents() {
return 0;
}
/**
* 序列化
*
* @param dest
* @param flags
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mName);
dest.writeInt(mAge);
dest.writeByte((byte) (mGender ? 1 : 0));
dest.writeStringList(mJobs);
dest.writeParcelable(mFriend, flags);// 序列化對象的時(shí)候傳入要序列化的對象和一個(gè)flag,這里的flag幾乎都是0,除非標(biāo)識當(dāng)前對象需要作為返回值返回,不能立即釋放資源
dest.writeTypedList(mFriends);
}
/**
* 負(fù)責(zé)反序列化
*/
public People(Parcel source) {
mName= source.readString();
mAge= source.readInt();
mGender= source.readByte() != 0;
mJobs= in.createStringArrayList();
mFriend= source.readParcelable(Friend.class.getClassLoader()); // 讀取對象需要提供一個(gè)類加載器去讀取,因?yàn)閷懭氲臅r(shí)候?qū)懭肓祟惖南嚓P(guān)信息
mFriends.readTypedList(mFriends, Friend.CREATOR); //對應(yīng)writeTypeList
}
private static final Creator<People> CREATOR = new Creator<People>() {
/**
* 從序列化對象中,獲取原始的對象
* @param source
* @return
*/
@Override
public Album createFromParcel(Parcel source) {
return new People(source);
}
/**
* 創(chuàng)建指定長度的原始對象數(shù)組
* @param size
* @return
*/
@Override
public People[] newArray(int size) {
return new People[size];
}
};
}
下圖是過程模型:

寫入和讀取集合有兩種方式,
一是寫入類的相關(guān)信息,然后通過類加載器去讀取, –> writeList | readList;
二是不用類相關(guān)信息,創(chuàng)建時(shí)傳入相關(guān)類的CREATOR來創(chuàng)建 –> writeTypeList | readTypeList | createTypedArrayList
第二種效率高一些
一定要注意如果有集合定義的時(shí)候一定要初始化
public ArrayList<T> demo = new ArrayList<>();