把你的對象給別人,你猜他會不會要?

【威哥說】在編程中咱們常常要傳遞數據,而在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 。
相關文章
相關標籤/搜索