序列化概念
對(duì)象的序列化 : 把Java對(duì)象轉(zhuǎn)換為字節(jié)序列并存儲(chǔ)至一個(gè)儲(chǔ)存媒介的過程。
對(duì)象的反序列化:把字節(jié)序列恢復(fù)為Java對(duì)象的過程。
為什么要將對(duì)象序列化?
1、永久性保存對(duì)象,保存對(duì)象的字節(jié)序列到本地文件中;
2、用過序列化對(duì)象在網(wǎng)絡(luò)中傳遞對(duì)象;
3、通過序列化對(duì)象在進(jìn)程間傳遞對(duì)象。
serializable
對(duì)于Serializable,類只需要實(shí)現(xiàn)Serializable接口,并提供一個(gè)序列化版本id(serialVersionUID)即可。
private static final long serialVersionUID=0L;
** 案例1: **
1)MySerializable.java
public class MySerializable implements Serializable {...}
2)MainActivity.java
MySerializable mySerializable = new MySerializable ();
Intent intent = new Intent(this,Second.class);
intent.putExtra("mySerializable",mySerializable );
3)Second.java
Intent intent = getIntent();
MySerializable mySerializable = intent.getSerializableExtra("mySerializable");
parcelable
- 實(shí)現(xiàn)Parcelable接口
- 添加實(shí)體屬性
- 覆寫writeToParcel(Parcel dest, int flags)方法,指定寫入Parcel類的數(shù)據(jù)。
- 創(chuàng)建Parcelable.Creator靜態(tài)對(duì)象,有兩個(gè)方法createFromParcel(Parcel in)與newArray(int size),前者指定如何從Parcel中讀取出數(shù)據(jù)對(duì)象,后者創(chuàng)建一個(gè)數(shù)組。
- 覆寫describeContents方法,默認(rèn)返回0。
Parcelable 示例代碼:
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];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
存入數(shù)據(jù):
Bundle bundle = new Bundle();
bundle.putParcelable("myParcelable", myParcelable );
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
取出數(shù)據(jù):
Intent intent = getIntent();
Bundle bun = intent.getExtras();
MyParcelable myParcelable = bun.getParcelable("myParcelable");
System.out.println(myParcelable );
serializable與parcelable的選擇
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。