【威哥說】在編程中咱們常常要傳遞數據,而在Android開發中不可避免要傳輸對象數據,因此,就有了序列化,在java中序列化要使用Serializable,Android中雖然也可使用Serializable,可是Google推薦咱們使用Parcelable,那麼這兩個到底用哪一個好?今天咱們就來講說Android序列化那些事。java
【正文】android
1、首先序列化緣由:編程
1.永久性保存對象,保存對象的字節序列到本地文件中; 2.經過序列化對象在網絡中傳遞對象; 3.經過序列化在進程間傳遞對象。
2、怎樣實現序列化:數組
Android中實現序列化有兩種方法: 1.將須要序列化的類實現Serializable接口就能夠,JavaSE自己就支持。Serializable接口中沒有任何方法,能夠理解爲一個標記,即代表這個類能夠序列化。 2.實現Parcelable接口,這是Android特有功能,效率比實現Serializable接口高效,可用於Intent數據傳遞,也能夠用於進程間通訊(IPC)。實現Serializable接口很是簡單,聲明一下就能夠了,而實現Parcelable接口稍微複雜一些,但效率更高,推薦用這種方法提升性能。 這裏還要注意的是Android中Intent傳遞對象有兩種方法:一是Bundle.putSerializable(Key,Object),另外一種是Bundle.putParcelable(Key,Object)。固然這些Object是有必定的條件的,前者是實現了Serializable接口,然後者是實現了Parcelable接口。
3、下面看下Serializable實現與Parcelabel實現的區別網絡
1)Serializable的實現,只須要implements Serializable 便可。這只是給對象打了一個標記,系統會自動將其序列化。 2)Parcelabel的實現,不只須要implements Parcelabel,還須要在類中添加一個靜態成員變量CREATOR,這個變量須要實現 Parcelable.Creator 接口。
4、Serializable實現比較簡單,實現接口就能夠了。實現Parcelable步驟以下ide
1.implements Parcelable 2.重寫writeToParcel方法,將你的對象序列化爲一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包須要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據 3.重寫describeContents方法,內容接口描述,默認返回0就能夠 4.實例化靜態內部對象CREATOR實現接口Parcelable.Creator public static final Parcelable.Creator<T> CREATOR 注其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須所有大寫。需重寫本接口中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層,newArray(int size) 建立一個類型爲T,長度爲size的數組,僅一句話便可(return new T[size]),供外部類反序列化本類數組使用。 簡而言之:經過writeToParcel將你的對象映射成Parcel對象,再經過createFromParcel將Parcel對象映射成你的對象。也能夠將Parcel當作是一個流,經過writeToParcel把對象寫到流裏面,在經過createFromParcel從流裏讀取對象,只不過這個過程須要你來實現,所以寫的順序和讀的順序必須一致。 實現Parcelable演示:
package com.moliying.parcelabledemo;性能
import android.os.Parcel; import android.os.Parcelable;this
/**code
做者:dongcai on 2016/9/9 16:12對象
郵箱:lidongcaiocc@163.com */ public class UserBean implements Parcelable{
private String username; private int age; private String sex;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(username); dest.writeInt(age); dest.writeString(sex); }
public static final Parcelable.Creator<UserBean> CREATOR = new Creator<UserBean>() { @Override public UserBean[] newArray(int size) { return new UserBean[size]; }
@Override public UserBean createFromParcel(Parcel in) { return new UserBean(in); }
};
public UserBean(Parcel in) { username = in.readString(); sex = in.readString(); age = in.readInt(); } }
5、最後那咱們到底應該用哪一個項目,這裏能夠參照以下原則:
1.在使用內存的時候,Parcelable 類比Serializable性能高,因此推薦使用Parcelable類。 2.Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC。 3.Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable不能很好的保證數據的持續性在外界有變化的狀況下。儘管Serializable效率低點, 也不提倡用,但在這種狀況下,仍是建議你用Serializable 。