Android序列化:Serializable Parcelable
原文出處:http://blog.csdn.net/jdsjlzx/article/details/51122109?locationNum=14&fps=1
對于Parcel的理解: 在Android系統中,定位為針對內存受限的設備,因此對性能要求更高,另外系統中采用了新的IPC(進程間通信)機制,必然要求使用性能更出色的對象傳輸方式。顯然,JAVA的Serialize利用外部存儲設備被認為是低效的, 可能也無法完美匹配Binder機制。在這樣的環境下,Parcel被設計出來,其定位就是輕量級的高效的對象序列化和反序列化機制。
為了便于ipc之間傳遞的數據的操作,binder引入了parcel的概念。parcel可以想成快遞公司的包裝箱,需要傳遞的各種類型的數據都被打包進parcel類,binder負責傳遞parcel對象,接收端則從parcel解出數據。這樣的機制即減少了各種數據類型對傳遞的復雜性,又可以通過增加打包/解包parcel的數據類型,輕易實現擴展。 parcel已經支持容納基本數據類型和一些復合數據類型。
下面內容轉自 dairyman的專欄:http://blog.csdn.net/dairyman000/article/details/7247619
Parcel 在英文中有兩個意思,其一是名詞,為包裹,小包的意思; 其二為動詞,意為打包,扎包。郵寄快遞中的包裹也用的是這個詞。
Android采用這個詞來表示封裝消息數據。這個是通過IBinder通信的消息的載體。需要明確的是Parcel用來存放數據的是內存(RAM),而不是永久性介質(Nand等)。
Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。
一個實體(用類來表示),如果需要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成為“可打包的”了。
接口的定義如下:
Parcelable.java
public interface Parcelable {//內容描述接口,基本不用管 public int describeContents();//寫入接口函數,打包 public void writeToParcel(Parcel dest, int flags);//讀取接口,目的是要從Parcel中構造一個實現了Parcelable的類的實例處理。 //因為實現類在這里還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。 //為了能夠實現模板參數的傳入,這里定義Creator嵌入接口,內含兩個接口函數分別返回單個和多個繼承類實例。 public interface Creator<T> {public T createFromParcel(Parcel source);public T[] newArray(int size);} }在實現Parcelable的實現中,規定了必須定義一個靜態成員, 初始化為嵌入接口的實現類。
public static Parcel.Creator<DrievedClassName> CREATOR= new Parcel.Creator<DrievedClassName>();下面內容轉自 Java-Jinguo:http://jinguo.iteye.com/blog/657240
需求:我們經常需要在多個部件(activity或service)之間通過Intent傳遞一些數據,簡單類型(如數字、字符串)的可以直接放入Intent。復雜類型(例如,J2ee中的Bean)的必須實現Parcelable接口。示例如下:
SampleBean.java
class SampleBean implements Parcelable {private Bundle mBundle=new Bundle();public String getArriveTime(){return mBundle.getString("arriveTime");}public String getOlTime(){return mBundle.getString("olTime");}public void setArriveTime(String arriveTime){this.mBundle.putString("arriveTime", arriveTime);}public void setOlTime(String olTime){this.mBundle.putString("olTime", olTime);} public int describeContents(){return 0;} public void writeToParcel(Parcel out, int arg1){out.writeBundle(this.mBundle);}public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {public TrainInfo createFromParcel(Parcel in){SampleBean ti=new SampleBean();ti.mBundle=in.readBundle(); // 從Parcel中讀出Bundlereturn ti;}public SampleBean[] newArray(int size){return new SampleBean[size];}}; }這里采用Bundle是因為在Parcel中并沒有key的概念存在,而Bundle相當于Map。
下面內容轉自 lincode :http://www.blogjava.net/lincode/archive/2011/09/16/358805.html
Serializable 和 Parcelable 區別
android 中自定義的對象序列化的問題有兩個選擇一個是Parcelable,
另外一個是Serializable
序列化原因
- 永久性保存對象,保存對象的字節序列到本地文件中;
- 通過序列化對象在網絡中傳遞對象;
- 通過序列化在進程間傳遞對象。
至于選取哪種可參考下面的原則
- 在使用內存的時候,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類。
- Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
- Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable- 不能很好的保證數據的持續性在外界有變化的情況下。
- 盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable 。
Serializable是Java中的序列化接口,其使用起來簡單但是開銷很大,序列化和反序列化過程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此,更適合用在Android平臺上,它的缺點就是用起來稍微麻煩點,但是它的效率很高,這是Android推薦的序列化方式,因此,我們要首選Parcelable。Parcelable主要用在內存序列化上,通過Parcelable將對象序列化到存儲設備中或者將對象序列化后通過網絡傳輸也都是可以的,但是這個過程會稍顯復雜,因此在這兩種情況下建議大家使用Parcelable。
Android序列化與反序列化
http://blog.csdn.net/axi295309066/article/details/52938422
總結
以上是生活随笔為你收集整理的Android序列化:Serializable Parcelable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中的设计模式-状态模式
- 下一篇: Android开发日常笔记