1、Parcelable和Serializable有什麼用,它們有什麼差別?
作用:
Serializable是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。它的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這種傳輸可以是程式內的也可以是兩個程式間的。
而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程式內不同元件間以及不同Android程式間(AIDL)高效的傳輸資料而設計,這些資料僅在記憶體中存在,Parcelable是通過IBinder通訊的訊息的載體。
區別:
1)在使用記憶體的時候,Parcelable比Serializable效能高,所以推薦使用Parcelable。 2)Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC。 3)Parcelable不能使用在要將資料儲存在磁碟上的情況,因為Parcelable不能很好的保證資料的持續性在外界有變化的情況下。儘管Serializable效率低點,但此時還是建議使用Serializable 。
2、自定義一個類讓其實現Parcelable,大致流程是什麼?
自定義實體類PersonBean ,實現Parcelable介面
1).複寫writeToParcel 將物件資料序列化成一個Parcel物件(序列化之後成為Parcel物件.以便Parcel容器取出資料,其中flags標識有兩種值:0或1。為1時標識當前物件需要作為返回值返回,不能立刻釋放資源,即PARCELABLE_WRITE_RETURN_VALUE,不過幾乎所有情況都返回0)
2).複寫describeContents方法,預設值為0(返回當前物件的記憶體描述。如果含有檔案描述符,返回1 即CONTENTS_FILE_DESCRIPTOR,否則返回0,幾乎所有情況都返回0)
3).例項化靜態內部物件CREATOR,實現介面Parcelable.Creator 。
示例:
public class PersonBean implements Parcelable {
private String name;
private String age;
//從序列化後的物件中建立原始物件
protected PersonBean(Parcel in) {
name = in.readString();
age = in.readString();
}
//將Parcel容器中的資料轉換成物件資料
public static final Creator<PersonBean> CREATOR = new Creator<PersonBean>() {
//從序列化後的物件中建立原始物件
//從Parcel容器中取出資料並進行轉換
@Override
public PersonBean createFromParcel(Parcel in) {
return new PersonBean(in);
}
//建立指定長度的原始物件陣列
//返回物件資料的大小
@Override
public PersonBean[] newArray(int size) {
return new PersonBean[size];
}
};
//返回當前物件的記憶體描述。如果含有檔案描述符,返回1 即CONTENTS_FILE_DESCRIPTOR,
//否則返回0
//幾乎所有情況都返回0
@Override
public int describeContents() {
return 0;
}
//將當前物件寫入序列化結構中,其中flags標識有兩種值:0或1
//為1時標識當前物件需要作為返回值返回,不能立刻釋放資源,即PARCELABLE_WRITE_RETURN_VALUE
//不過幾乎所有情況都返回0
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(age);
}
}
複製程式碼