Android之序列化淺析

序列化是什麼

序列化是指把Java對象轉換爲字節序列並存儲到一個存儲媒介的過程。反之,把字節序列恢復爲Java對象的過程則稱之爲反序列化。 android

爲何要序列化

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。ide

Serializable接口的實現

只須要實現Serializable接口,並提供一個序列化版本id(serialVersionUID)便可。this

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進行傳遞了。code

//Activity傳遞對象,無論是實現哪一個接口都是用以下方式傳遞
intent.putExtra("data",data);

//在另外一個Activity中接收對象的方式分別是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");

Android中序列化的使用大體就是這樣了。對象

更多文章也可關注個人靜態博客,更新相對會優先些傳送門接口

相關文章
相關標籤/搜索