Android源碼(8) --- Binder(2) 序列化

Android 開發的時候,在對數據進行持久化的時候,或者數據傳遞的時候會用到序列化,這時候可以對當前數據類實現Serializable或者Parcelable接口。尤其是進程間通信時,傳遞數據需要對對象進行序列化。

序列化

  • 序列化指的是將一個實例對象編碼成字節流,並從字節流編碼中重新構建對象實例的能力。將一個對象編碼成字節流,稱爲序列化;從一個字節流中讀出一個對象實例,稱爲反序列化。

使用場景

  • 1.持久化存儲對象
  • 2.序列化對象在網絡中傳輸
  • 3.Bundle傳輸對象
  • 4.進程間參傳遞對象(Parcelable)

Serializable和Parcelable 區別

  • Serializable

    • Java自帶
    • 使用簡單、代碼量少,實現接口即可
    • 效率相較Parcelable低
    • 序列化時,產生大量臨時變量,引起頻繁GC
  • Parcelable

    • Android 專用
    • 使用稍複雜,代碼量相較而言多點,需要重寫相關序列化方法
    • 性能比Serializable高十倍以上
    • 對序列化完整對象進行拆解,每一部分都是Intent支持的類型。

使用

  • Serializable 只需要添加 serialVersionUID即可。也可以不添加,但是由於在修改序列化類後,反序列話檢查到serialVersionUID與運行時生成serialVersionUID不一致變會報錯:InvalidClassException。規範推薦添加serialVersionUID。
public class UserModel implements Serializable{
    private static final long serialVersionUID = 123456789L;
    public String userName;
    public int userId;

    public UserModel(String userName, int userId) {
        this.userName = userName;
        this.userId = userId;
    }
}
  • Parcelable
public class UserModel implements Parcelable {
    private String name;
    private int id;

    public UserModel(String name, int id) {
        this.name = name;
        this.id = id;
    }

    /**
     * 序列化
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(id);
    }

    @Override
    public int describeContents() {
        // 大都返回0即可
        return 0;
    }

    /**
     * 反序列化
     */
    public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
        @Override
        public UserModel createFromParcel(Parcel in) {
            // 反序列對象
            return new UserModel(in);
        }

        @Override
        public UserModel[] newArray(int size) {
            // 反序列數組
            return new UserModel[size];
        }
    };

    /**
     * 使用反序列化得到的 Parcel 構造對象
     */
    protected UserModel(Parcel in) {
        name = in.readString();
        id = in.readInt();
    }
}

總結

  • 在常見的Model序列化需要持久存儲用Serializable,操作簡單,上手快,工作效率提高。
  • 在Bundle傳遞對象和進程間通訊的情況下使用Parcelable(內存間的傳遞),性能至上。
發佈了65 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章