1.為什么要序列化
- 將對(duì)象的字節(jié)序列保存到本地文件辈末。
- 在網(wǎng)絡(luò)中傳遞對(duì)象。
- 在進(jìn)程或者Activity中傳遞對(duì)象。
2.序列化方式
序列化分為兩種:一種是實(shí)現(xiàn)Serializable接口挤聘,另一種是實(shí)現(xiàn)Parcelable接口轰枝。
- 實(shí)現(xiàn)Serializable接口
直接實(shí)現(xiàn)Serializable接口即可,此方法支持Java SE和Android组去,示例代碼如下:
public class Student implements Serializable {
private String name; private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
- 實(shí)現(xiàn)Parcelable接口
采用此方法相對(duì)復(fù)雜鞍陨,且僅支持Android,使用步驟如下:
- 實(shí)現(xiàn)Parcelable接口从隆,即implements Parcelable诚撵。
- 重寫(xiě)writeToParcel()方法,將對(duì)象序列化為一個(gè)Parcel對(duì)象键闺。
- 重寫(xiě)describeContents()方法寿烟,內(nèi)容接口描述,默認(rèn)返回0即可(暫時(shí)不清楚具體含義)辛燥。
- 實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR(變量必須用static final修飾筛武,變量名必須為CREATOR,并且為大寫(xiě))购桑。
示例代碼如下:
public class Student implements Parcelable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(name);
out.writeInt(age);
}
public static final Parcelable.Creator<student> CREATOR = new Parcelable.Creator<student>() {
@Override
public Student[] newArray(int size) {
return new Student[size];
}
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
};
/** * 屬性的讀取順序必須與writeToParcel()方法一致 */
public Student(Parcel in) {
name = in.readString(); age = in.readInt();
}
}
3.Serializable與Parcelabel的優(yōu)缺點(diǎn)
- 采用Serializable方式使用簡(jiǎn)單畅铭,只需要實(shí)現(xiàn)Serializable接口即可,但該方式采用了反射機(jī)制勃蜘,所以效率較低硕噩。
- 采用Parcelabel方式使用相對(duì)復(fù)雜,除了需要實(shí)現(xiàn)Parcelabel接口缭贡,還要添加CREATOR變量炉擅,但此種方式效率明顯高于Serializable方式。
4.適用范圍
Parcelabel適合在進(jìn)程間和Activity之間傳遞數(shù)據(jù)阳惹,而Serializable更傾向于網(wǎng)絡(luò)傳輸或者將對(duì)象本地化谍失。