Android之序列化淺析


序列化是什么

序列化是指把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中序列化的使用大致就是這樣了。

更多文章也可關注我的靜態博客,更新相對會優先些傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM