Android中的Serialization、Parcelable

Parcelable

這是一個接口,它的實例可以寫入Parcel或從Parcel恢復(fù)。實現(xiàn)Parcelable的類必須要有一個實現(xiàn)了Parcelable.Creator接口的類型的非空靜態(tài)字段CREATOR,這個字段是幫忙從一個Parcel產(chǎn)生一個Parcelable類的實例桌吃。

public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }
  • describeContents()用于描述Parcelable類實例的
  • writeToParcel(Parcel dest, int flags)用于將數(shù)據(jù)扁平化寫入Parcel

Parcel是一個消息(數(shù)據(jù)或?qū)ο笠茫┤萜靼危梢酝ㄟ^IBinder來發(fā)送,也就是說 Parcelable實例十分合適作來進(jìn)程間通信的消息載體搬卒。

java中使用Serializable接口實現(xiàn)對象的序列化,而在android中既可以使用Serializable也可以使用Parcelable接口實現(xiàn)對象序列化契邀,如果只在內(nèi)存操作時則傾向Parcelable接口,傳輸效率會更高效坯门。

注意:Parcelable只能對內(nèi)存對象序列化,不能對需要存儲在文件或SD等設(shè)備進(jìn)行序列化古戴,如果需要將對象序列化存儲到文件,實現(xiàn)Serializable接口就可以了

Serializablejava提供的一個序列化接口现恼,它是一個空接口黍檩,專門為對象提供標(biāo)準(zhǔn)的序列化和反序列化操作,用它實現(xiàn)類的序列化比較簡單建炫,只要在類聲明中實現(xiàn)Serializable接口即可。

public class User implements Serializable {
    private static final long serialVersionUID = -4454266436543306544L;

    private String name;
    /**
     * age
     */
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

由于serialVersionUID是用來輔助序列化和反序列化過程的,原則上序列化后的對象中serialVersionUID只有和當(dāng)前類的serialVersionUID相同才能夠正常被反序列化艺配,也就是說序列化與反序列化的serialVersionUID必須相同才能夠使序列化操作成功。序列化操作的時候系統(tǒng)會把當(dāng)前類的serialVersionUID寫入到序列化文件中转唉,當(dāng)反序列化時系統(tǒng)會去檢測文件中的serialVersionUID,判斷它是否與當(dāng)前類的serialVersionUID一致赠法,如果一致就說明序列化類的版本與當(dāng)前類版本是一樣的麦轰,可以反序列化成功砖织,否則失敗。因此強烈建議指定serialVersionUID侧纯,這樣的話即使微小的變化也不會導(dǎo)致crash的出現(xiàn),否則文件多一個空格或類的結(jié)構(gòu)有些許變化都會反序列化失敗眶熬。默認(rèn)情況下妹笆,系統(tǒng)會根據(jù)類結(jié)構(gòu)自動生成的serialVersionUID,因此當(dāng)類稍有變化娜氏,自動生成的UID就會與之前存在文件中的不一樣,就會反序列化失敗贸弥。因此有必要指定serialVersionUID,那么系統(tǒng)就會盡可能地序列化茂腥。

需要注意的是如果反序列的類的成員變量的類型或者類名發(fā)生了變化,即使serialVersionUID相同反序列化會失敗最岗。其次是靜態(tài)成員變量屬于類不屬于對象,不會參與序列化過程般渡,使用transient關(guān)鍵字標(biāo)記的成員變量也不參與序列化過程芙盘。

Serializable在內(nèi)存序列化是(將數(shù)據(jù)持久化在磁盤)上開銷比較大,如Serializable在序列化的時候會產(chǎn)生大量的臨時變量脸秽,從而引起頻繁的GC(垃圾回收),而內(nèi)存資源對于android系統(tǒng)來說是十分稀有的(首先记餐,我們每個應(yīng)用都會運行在各自的虛擬機上,而android系統(tǒng)分配給每個虛擬機的內(nèi)存開銷都是十分有限的)片酝。因此android中提供了Parcelable接口來實現(xiàn)序列化操作,Parcelable的性能比Serializable好雕沿,在內(nèi)存開銷方面較小,所以在內(nèi)存間數(shù)據(jù)傳輸時推薦使用Parcelable审轮,如通過Intent在activity間傳輸數(shù)據(jù),進(jìn)程間通信也推薦使用Parcelable

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疾渣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稳衬,更是在濱河造成了極大的恐慌,老刑警劉巖薄疚,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異街夭,居然都是意外死亡,警方通過查閱死者的電腦和手機板丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃碱,“玉大人,你說我怎么就攤上這事砚殿。” “怎么了似炎?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵悯姊,是天一觀的道長。 經(jīng)常有香客問我悯许,道長,這世上最難降的妖魔是什么先壕? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮启上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘店印。我一直安慰自己倒慧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布纫谅。 她就那樣靜靜地躺著,像睡著了一般付秕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上询吴,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音猛计,去河邊找鬼唠摹。 笑死奉瘤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盗温。 我是一名探鬼主播藕赞,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼卖局,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吼驶?” 一聲冷哼從身側(cè)響起惩激,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顷蟀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骡技,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年囤萤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涛舍。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖富雅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肛搬,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布温赔,位于F島的核電站,受9級特大地震影響陶贼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骇窍,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腹纳。 院中可真熱鬧痢掠,春花似錦嘲恍、人聲如沸足画。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俘侠。三九已至蔬将,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間央星,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工莉给, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颓遏。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像叁幢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子曼玩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容