IPC機(jī)制 -- 基礎(chǔ)知識(shí) -- Serializable和Parcelable

Serializable和Parcelable接口可以完成對(duì)象的序列化過(guò)程拖刃。
當(dāng)我們需要通過(guò)Intent和Binder傳輸數(shù)據(jù)時(shí)就需要使用Parcelable或者Serializable抖誉;當(dāng)我們需要把對(duì)象持久化到存儲(chǔ)設(shè)備上或者通過(guò)網(wǎng)絡(luò)傳輸給其它客戶(hù)端時(shí)也需要使用Serializable缠黍。

一怯屉、Serializable接口

Serializable是Java提供的一個(gè)序列號(hào)接口窥淆,它是一個(gè)空接口驰怎,為對(duì)象提供標(biāo)準(zhǔn)的序列化和反序列化操作钞馁。

//序列化對(duì)象
public class Person implements Serializable{ //實(shí)現(xiàn)Serializable接口
    private static final long serialVersionUID = 7060210544600464481L; //聲明serialVersionUID
    private String name;
    private int age;

    public Person(String, name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return name;
    }

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

    public int getAge(){
        return age;
    }
  
    public void setAge(int age){
        this.age = age;
    }
}

//序列化過(guò)程
Person person = new Person("Tomy", 28);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(person);
out.close();

//反序列化過(guò)程
ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
Person person = (Person)in.readObject();
in.close();

serialVersionUID工作機(jī)制:

序列化的時(shí)候系統(tǒng)會(huì)把當(dāng)前類(lèi)的serialVersionUID寫(xiě)入序列化文件中(也可能是其他中介)虑省,當(dāng)反序列化的時(shí)候系統(tǒng)會(huì)去檢測(cè)文件中的serialVersionUID,看它是否和當(dāng)前類(lèi)的serialVersionUID一致僧凰,如果一致就說(shuō)明序列化的類(lèi)的版本和當(dāng)前類(lèi)的版本是相同的探颈,這個(gè)時(shí)候可以成功反序列化,否則就說(shuō)明當(dāng)前類(lèi)和序列化的類(lèi)相比發(fā)生了某些變換训措,比如成員變量的數(shù)量伪节、類(lèi)型可能發(fā)生了改變光羞,這個(gè)時(shí)候是無(wú)法正常反序列化的。

需要注意兩點(diǎn):

(1)靜態(tài)成員變量屬于類(lèi)而不屬于對(duì)象架馋,所以不會(huì)參與序列化過(guò)程狞山。
(2)用transient關(guān)鍵字標(biāo)記的成員變量不參與序列化過(guò)程。

二叉寂、Parcelable接口

只要實(shí)現(xiàn)Parcelable接口萍启,一個(gè)類(lèi)的對(duì)象就可以實(shí)現(xiàn)序列化并通過(guò)Intent和Binder傳遞。系統(tǒng)提供了許多實(shí)現(xiàn)Parcelable接口的類(lèi)屏鳍,比如Intent勘纯、Bundle、Bitmap等钓瞭,同時(shí)List和Map也可以序列化驳遵,前提是它們里面的每個(gè)元素都是可序列化的。

public class Person implements Parcelable {
    private String name;
    private int age;
    pivate Book book; //另一個(gè)可序列化的對(duì)象

    public int describeContents() { 
        return 0; //幾乎所有情況都返回0山涡,僅當(dāng)當(dāng)前對(duì)象中存在文件描述符時(shí)返回1
    }

    public void writeToParcel(Parcel out, int flags) { //序列化
        out.writeString(name);
        out.writeInt(age);
        out.writeParcelable(book, 0);
    }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        public Person createFromParcel(Parcel in) { //反序列化
            return new Person(in); //創(chuàng)建序列化對(duì)象
        }

        public Person[] newArray(int size) {
            return new Person[size]; //創(chuàng)建序列化數(shù)組
        }
    };

    private Person(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
        this.book = in.readParcelable(Thread.currentThread().getContextClassLoader()); //傳遞當(dāng)前線程的上下文類(lèi)加載器
    }
}

三堤结、總結(jié)

Serializable是Java中的序列化接口,其使用起來(lái)簡(jiǎn)單但是開(kāi)銷(xiāo)很大鸭丛,序列化和反序列化過(guò)程需要大量I/O操作竞穷。而Parcelable是Android中的序列化方式,使用起來(lái)稍微麻煩但是效率高鳞溉,這是Android推薦的序列化方式瘾带,因此首選Parcelable。
Parcelable主要用在內(nèi)存序列化熟菲。
Serializable主要用在將對(duì)象序列化到存儲(chǔ)設(shè)備或者將對(duì)象序列化后通過(guò)網(wǎng)絡(luò)傳輸看政。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抄罕,隨后出現(xiàn)的幾起案子允蚣,更是在濱河造成了極大的恐慌,老刑警劉巖呆贿,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚷兔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡榨崩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)章母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)母蛛,“玉大人,你說(shuō)我怎么就攤上這事乳怎〔式迹” “怎么了前弯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秫逝。 經(jīng)常有香客問(wèn)我恕出,道長(zhǎng),這世上最難降的妖魔是什么违帆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任浙巫,我火速辦了婚禮,結(jié)果婚禮上刷后,老公的妹妹穿的比我還像新娘的畴。我一直安慰自己,他們只是感情好尝胆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布丧裁。 她就那樣靜靜地躺著,像睡著了一般含衔。 火紅的嫁衣襯著肌膚如雪煎娇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天贪染,我揣著相機(jī)與錄音缓呛,去河邊找鬼。 笑死抑进,一個(gè)胖子當(dāng)著我的面吹牛强经,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寺渗,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匿情,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了信殊?” 一聲冷哼從身側(cè)響起炬称,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涡拘,沒(méi)想到半個(gè)月后玲躯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳄乏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年跷车,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橱野。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朽缴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出水援,到底是詐尸還是另有隱情密强,我是刑警寧澤茅郎,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站或渤,受9級(jí)特大地震影響系冗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薪鹦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一掌敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧距芬,春花似錦涝开、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至离斩,卻和暖如春银舱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跛梗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工寻馏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人核偿。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓诚欠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親漾岳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轰绵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345