Serializable和Parcrelable區別

Serializable

只需實現Serializable接口,最好手動設置一個serialVersionUID

public class User implements Serializable {

    private static final long serialVersionUID= 38749603244545L;

    public int userId;
    public String userName;
    public String password;
}

注意點:
1.靜態成員變量屬於類不屬於對象,所以不參與序列化過程
2.用transient關鍵字標記的成員變量不參與序列化過程

Parcelable

實現Parcelable接口

public class User implements Parcelable {
    public int userId;
    public String userName;
    public String pasword;
    public Book book;

    @Override
    public int describeContents() {
    	//幾乎所有情況都返回0,僅在當前對象中存在文件描述符時返回1
        return 0;
    }
    
	//將當前對象寫入序列化結構中
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(userId);
        dest.writeString(userName);
        dest.writeString(pasword);
        dest.writeParcelable((Parcelable) book,0);
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
    	//從序列化後的對象中創建原始對象
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }
		
		//創建指定長度的原始對象數組
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

	//從序列化後的對象中創建原始對象
    protected User(Parcel in) {
        userId = in.readInt();
        userName = in.readString();
        pasword = in.readString();
        book = in.readParcelable(Thread.currentThread().getContextClassLoader());
    }

}

兩者區別

區別 Serializable Parcelable
所屬API JAVA API Android SDK API
原理 序列化和反序列化過程需要大量的I/O操作 序列化和反序列化過程不需要大量的I/O操作
開銷 開銷大 開銷小
效率 很高
使用場景 序列化到本地或者通過網絡傳輸 內存序列化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章