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