Android 序列化 Parcelable VS Serializable

Android 的序列化方式 Parcelable

Parcel 介紹:Parcel 內(nèi)部包裝了可序列化的數(shù)據(jù)缠沈,可以在 Binder 中自由傳輸

Parcelable 是一個(gè)接口儿倒,只要實(shí)現(xiàn)這個(gè)接口掰吕,一個(gè)類(lèi)的對(duì)象就可以實(shí)現(xiàn)序列化并可以通過(guò) Intent 和 Binder 傳遞果覆。

    package com.renxl.touchevent.scrollview;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable {
    
        private String name;
        private int price;
        private Category category;
    
    
        protected Book(Parcel in) {
            name = in.readString();
            price = in.readInt();
            category = in.readParcelable(Category.class.getClassLoader());
        }
    
        public static final Creator<Book> CREATOR = new Creator<Book>() {
            @Override
            public Book createFromParcel(Parcel in) {
                return new Book(in);
            }
    
            @Override
            public Book[] newArray(int size) {
                return new Book[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(price);
            dest.writeParcelable(category, flags);
        }
    }

由上段代碼可以看出序列化過(guò)程需要實(shí)現(xiàn)的功能有 序列化反序列化殖熟,內(nèi)容描述 三部分

一局待、序列化功能

序列化功能是由 writeToParcel 方法完成的,是通過(guò) Parcel 的一些了 write 方法完成的菱属。
注意:序列化的類(lèi)的成員屬性也必須是可序列化的钳榨。Parcel 的 writeParcelable 方法中除了可序列化的屬性,還需要添加 int 類(lèi)型的 flag 參數(shù)纽门,表示該對(duì)象應(yīng)以何種方式寫(xiě)入薛耻,一般傳 writeToParcel 方法的 flag 參數(shù)或者0。

二赏陵、反序列化功能

反序列化過(guò)程由 CREATOR 來(lái)完成饼齿,其內(nèi)部表明了如何創(chuàng)建序列化對(duì)象和序列化對(duì)象的數(shù)組,創(chuàng)建序列化對(duì)象使用了序列化對(duì)象的參數(shù)為 Parcel 的構(gòu)造方法蝙搔,該方法中根據(jù)序列化過(guò)程得到的 Parcel 對(duì)象的 read 系列方法將序列化對(duì)象的內(nèi)容還原完成反序列化過(guò)程缕溉。

如果序列化類(lèi)的屬性有可序列化對(duì)象,在反序列化過(guò)程中需要傳遞當(dāng)前線程的上下文類(lèi)加載器吃型,否則會(huì)報(bào)無(wú)法找到類(lèi)的錯(cuò)誤证鸥。

三、內(nèi)容描述功能

內(nèi)容描述功能由 describeContents 完成勤晚,幾乎所有情況該方法都返回 0 枉层,僅當(dāng)當(dāng)前對(duì)象中存在的文件描述符時(shí)此方法返回 1 。

文件描述符: 文件描述符在形式上是一個(gè)非負(fù)整數(shù)赐写。實(shí)際上返干,它是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開(kāi)文件的記錄表血淌。當(dāng)程序打開(kāi)一個(gè)現(xiàn)有文件或者創(chuàng)建一個(gè)新文件時(shí)矩欠,內(nèi)核向進(jìn)程返回一個(gè)文件描述符。在程序設(shè)計(jì)中悠夯,一些涉及底層的程序編寫(xiě)往往會(huì)圍繞著文件描述符展開(kāi)癌淮。但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統(tǒng)沦补。

Android 系統(tǒng)提供的實(shí)現(xiàn)了 Parcelable 的類(lèi)乳蓄,Intent,Bundle夕膀,Bitmap等虚倒,List 和 Map 也可以序列化美侦,前提是里面的內(nèi)容都可以序列化。

序列化方式 Serializable 接口

Java 中提供的序列化方式魂奥,實(shí)現(xiàn) Serializable 接口菠剩,是一個(gè)空接口,為對(duì)象提供了標(biāo)準(zhǔn)的序列化和反序列化操作耻煤。
只需要在類(lèi)的聲明中指定 private static final long serialVersionUID = 123423432234L 即可具壮,該值并不是必須的

serialVersionUID 作用為輔助序列化和反序列化過(guò)程,反序列化時(shí)序列化數(shù)據(jù)中的 serialVersionUID 和當(dāng)前類(lèi)的 serialVersionUID 相同是才能成功哈蝇,不相同則會(huì)反序列化是吧棺妓,程序 crash。類(lèi)中該值不指定時(shí)可以根據(jù)當(dāng)前類(lèi)的結(jié)構(gòu)自動(dòng)生成 hash 炮赦,不過(guò)當(dāng)類(lèi)結(jié)構(gòu)變化時(shí)反序列化會(huì)失敗怜跑。如果指定,就算類(lèi)的結(jié)構(gòu)發(fā)生改變也會(huì)最大限度的恢復(fù)數(shù)據(jù)吠勘。

還有兩點(diǎn)點(diǎn)需要注意

  1. 靜態(tài)成員變量屬于類(lèi)不屬于對(duì)象妆艘,所以不參與序列化過(guò)程,反序列化得到的對(duì)象也可以使用該屬性看幼,但原理是因?yàn)槭褂玫氖穷?lèi)的靜態(tài)變量
  2. 被 transient 修飾的成員不參與序列化批旺,反序列化后也不會(huì)得到 transient 修飾的成員

Parcelable 和 Serializable 區(qū)別

  1. 兩者都可以實(shí)現(xiàn)序列化并且都可以用于 Intent 間數(shù)據(jù)傳遞
  2. Serializable 是 Java 中的序列化接口,使用簡(jiǎn)單但是開(kāi)銷(xiāo)很大诵姜,序列化和反序列化過(guò)程需要很多 I/O 操作
  3. Parcelable 是 Android 中的序列化方式汽煮,更適合用在 Android 中,確定是使用麻煩棚唆,但是效率很高暇赤。Android 中首選 Parcelable
  4. Parcelable 主要用于 Android 跨進(jìn)程通信時(shí)在對(duì)內(nèi)存數(shù)據(jù)的序列話,跨進(jìn)程傳輸?shù)臄?shù)據(jù)是必須序列化的宵凌,Parcelable 更方便
  5. 將對(duì)象序列化到設(shè)備的本地文件或者網(wǎng)絡(luò)傳輸鞋囊,建議使用 Serializable,
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞎惫,一起剝皮案震驚了整個(gè)濱河市溜腐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓜喇,老刑警劉巖挺益,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乘寒,居然都是意外死亡望众,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烂翰,“玉大人夯缺,你說(shuō)我怎么就攤上這事「使ⅲ” “怎么了踊兜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棵里。 經(jīng)常有香客問(wèn)我,道長(zhǎng)姐呐,這世上最難降的妖魔是什么殿怜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮曙砂,結(jié)果婚禮上头谜,老公的妹妹穿的比我還像新娘。我一直安慰自己鸠澈,他們只是感情好柱告,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著笑陈,像睡著了一般际度。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涵妥,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天乖菱,我揣著相機(jī)與錄音,去河邊找鬼蓬网。 笑死窒所,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帆锋。 我是一名探鬼主播吵取,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锯厢!你這毒婦竟也來(lái)了皮官?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤实辑,失蹤者是張志新(化名)和其女友劉穎臣疑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體徙菠,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讯沈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缺狠。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡问慎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挤茄,到底是詐尸還是另有隱情如叼,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布穷劈,位于F島的核電站笼恰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歇终。R本人自食惡果不足惜社证,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望评凝。 院中可真熱鬧追葡,春花似錦、人聲如沸奕短。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翎碑。三九已至谬返,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間日杈,已是汗流浹背朱浴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留达椰,地道東北人翰蠢。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像啰劲,于是被迫代替她去往敵國(guó)和親梁沧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1蝇裤、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2廷支、Andro...
    隔壁老李頭閱讀 11,847評(píng)論 6 38
  • JAVA序列化機(jī)制的深入研究 對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整...
    時(shí)待吾閱讀 10,863評(píng)論 0 24
  • What? 何為序列化與反序列化栓辜?序列化:將對(duì)象轉(zhuǎn)化為二進(jìn)制序列的過(guò)程反序列化:將二進(jìn)制序列恢復(fù)為原始對(duì)象的過(guò)程 ...
    LilacZiyun閱讀 2,996評(píng)論 0 15
  • 概念:序列化的意思籠統(tǒng)的來(lái)說(shuō)就是將對(duì)象轉(zhuǎn)化成二進(jìn)制恋拍,用于在文件或者網(wǎng)絡(luò)上進(jìn)行傳輸;反序列化就是相反藕甩,將序列化后的二...
    dev_journey閱讀 1,064評(píng)論 0 0
  • 目錄1施敢、序列化與反序列化概念2、序列化用途3、Serializable實(shí)現(xiàn)序列化4僵娃、 Parcelable實(shí)現(xiàn)序列...
    RaphetS閱讀 2,866評(píng)論 1 9