序列化是什麼 序列化是指 把Java對象轉換為位元組序列並存儲到一個存儲媒介的過程 。反之, 把位元組序列恢復為Java對象的過程 則稱之為反序列化。<! more 為什麼要序列化 Java對象存在的一個前提是JVM有在運行,因此,如果JVM沒有運行或者在其他機器的JVM上是不可能獲取到指定的Java對 ...
序列化是什麼
序列化是指把Java對象轉換為位元組序列並存儲到一個存儲媒介的過程。反之,把位元組序列恢復為Java對象的過程則稱之為反序列化。
為什麼要序列化
Java對象存在的一個前提是JVM有在運行,因此,如果JVM沒有運行或者在其他機器的JVM上是不可能獲取到指定的Java對象的。而序列化操作則是把Java對象信息保存到存儲媒介,可以在以上不可能的情況下仍然可以使用Java對象。
所以,序列化的主要作用是:
- 永久性保存對象,保存對象的位元組序列到本地文件中;
- 通過序列化對象在網路中傳遞對象;
- 通過序列化在進程間傳遞對象。
Android中序列化
在Android開發中,經常需要在多個部件(Activity、Fragment或Service)之間通過Intent傳遞一些數據,如果是一些普通類型的數據可以通過PutExtra()進行傳遞,如果是對象的話就得先進行序列化才能傳遞了。在Android中有兩種序列化的介面,Serializable和Parcelable。
- Serializable:(JavaSE本身就支持的)保存對象的屬性到本地文件、資料庫、網路流、rmi以方便數據傳輸。
- Parcelable:(Android特有功能)因為Serializable效率過慢,為了在程式內不同組件間以及不同Android程式間(AIDL)高效
的傳輸數據而設計,這些數據僅在記憶體中存在。
何時使用它們
Parcelable的效率會比Serializable高,數據僅存在於記憶體中。;而Serializable因為使用到了反射,會相對慢一些,因此,只在記憶體間傳遞數據的話推薦用Parcelable,而如果是要進行保存或者網路傳輸則選擇Serializable。
Serializable介面的實現
只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。
public class DataBean implements Serializable{
...
}
Parcelable介面的使用
Parcelable實現方式略複雜一些,需重寫describeContents和writeToParcel這兩個方法提供一個名為CREATOR常量。實際上就是將如何打包和解包的工作自己來定義,
而序列化的這些操作完全由底層實現。
public class DataBean implements Parcelable{
private int id;
private String name;
private String Account;
private int kind;
private String password;
private String desc;
public DataBean(){}
// 用來創建自定義的Parcelable的對象
public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
@Override
public DataBean createFromParcel(Parcel in) {
return new DataBean(in);
}
@Override
public DataBean[] newArray(int size) {
return new DataBean[size];
}
};
//GET SET方法
...
@Override
public String toString() {
return "DataBean{" +
"id=" + id +
", name='" + name + '\'' +
", Account='" + Account + '\'' +
", kind=" + kind +
", password='" + password + '\'' +
", desc='" + desc + '\'' +
'}';
}
@Override
public int describeContents() {
return 0;
}
// 寫數據進行保存
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.Account);
dest.writeString(this.name);
dest.writeString(this.password);
dest.writeInt(this.kind);
dest.writeString(this.desc);
}
// 讀數據進行恢復
protected DataBean(Parcel in) {
this.id = in.readInt();
this.kind = in.readInt();
this.password = in.readString();
this.name = in.readString();
this.Account = in.readString();
this.desc = in.readString();
}
}
這樣就完成了對DataBean的序列化,使用的時候就可以通過Intent進行傳遞了。
//Activity傳遞對象,不管是實現哪個介面都是用如下方式傳遞
intent.putExtra("data",data);
//在另一個Activity中接收對象的方式分別是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");
Android中序列化的使用大致就是這樣了。
更多文章也可關註我的靜態博客,更新相對會優先些傳送門