Android序列化淺析

一、序列化是什么:

序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列并存儲(chǔ)到一個(gè)存儲(chǔ)媒介的過(guò)程。反之色冀,把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程則稱之為反序列化。

二柱嫌、為什么要序列化:

Java對(duì)象存在的一個(gè)前提是JVM有在運(yùn)行锋恬,因此,如果JVM沒有運(yùn)行或者在其他機(jī)器的JVM上是不可能獲取到指定的Java對(duì)象的编丘。而序列化操作則是把Java對(duì)象信息保存到存儲(chǔ)媒介与学,可以在以上不可能的情況下仍然可以使用Java對(duì)象。

三嘉抓、序列化的主要作用:

永久性保存對(duì)象索守,保存對(duì)象的字節(jié)序列到本地文件中;
通過(guò)序列化對(duì)象在網(wǎng)絡(luò)中傳遞對(duì)象抑片;
通過(guò)序列化在進(jìn)程間傳遞對(duì)象卵佛。

四、Android中序列化:

在Android開發(fā)中敞斋,經(jīng)常需要在多個(gè)部件(Activity截汪、Fragment或Service)之間通過(guò)Intent傳遞一些數(shù)據(jù),如果是一些普通類型的數(shù)據(jù)可以通過(guò)PutExtra()進(jìn)行傳遞植捎,如果是對(duì)象的話就得先進(jìn)行序列化才能傳遞了衙解。在Android中有兩種序列化的接口,Serializable和Parcelable焰枢。

Serializable:(JavaSE本身就支持的)保存對(duì)象的屬性到本地文件蚓峦、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)流医咨、rmi以方便數(shù)據(jù)傳輸枫匾。
Parcelable:(Android特有功能)因?yàn)镾erializable效率過(guò)慢架诞,為了在程序內(nèi)不同組件間以及不同Android程序間(AIDL)高效
的傳輸數(shù)據(jù)而設(shè)計(jì)拟淮,這些數(shù)據(jù)僅在內(nèi)存中存在。

五谴忧、Parcelable和Serializable的比較:

區(qū)別 Serializable Parcelable
所屬API JAVA API Android SDK API
原理 序列化和反序列化過(guò)程需要大量的I/O操作 序列化和反序列化過(guò)程不需要大量的I/O操作
開銷 開銷大 開銷小
效率 很高
使用場(chǎng)景 序列化到本地或者通過(guò)網(wǎng)絡(luò)傳輸 內(nèi)存序列化

1)在使用內(nèi)存的時(shí)候很泊,Parcelable比Serializable性能高,所以推薦使用Parcelable沾谓。
2)Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量委造,從而引起頻繁的GC。
3)Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤上的情況均驶,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下昏兆。盡管Serializable效率低點(diǎn),但此時(shí)還是建議使用Serializable 妇穴。

對(duì)于使用序列化還有兩點(diǎn)需要了解:
1.靜態(tài)成員變量屬于類不屬于對(duì)象爬虱,所以不參與序列化過(guò)程
2.用transient關(guān)鍵字標(biāo)記的成員變量不參與序列化過(guò)程

六隶债、兩種序列化方式的實(shí)現(xiàn):

Serializable接口的實(shí)現(xiàn)
只需要實(shí)現(xiàn)Serializable接口,并提供一個(gè)序列化版本id(serialVersionUID)即可跑筝。

public class DataBean implements Serializable{
...
}

Parcelable接口的使用
Parcelable實(shí)現(xiàn)方式略復(fù)雜一些死讹,需重寫describeContents和writeToParcel這兩個(gè)方法提供一個(gè)名為CREATOR常量。實(shí)際上就是將如何打包和解包的工作自己來(lái)定義曲梗,
而序列化的這些操作完全由底層實(shí)現(xiàn)赞警。

public class DataBean implements Parcelable{
private int id;
private String name;
private String Account;
private int kind;
private String password;
private String desc;

public DataBean(){}
// 用來(lái)創(chuàng)建自定義的Parcelable的對(duì)象
public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
    @Override
    public DataBean createFromParcel(Parcel in) {
        return new DataBean(in);
    }

    @Override
    public DataBean[] newArray(int size) {
        return new DataBean[size];
    }
};

   //GET SET方法
   ...

@Override
public String toString() {
    return "DataBean{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", Account='" + Account + '\'' +
            ", kind=" + kind +
            ", password='" + password + '\'' +
            ", desc='" + desc + '\'' +
            '}';
}

@Override
public int describeContents() {
    return 0;
}
// 寫數(shù)據(jù)進(jìn)行保存
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.id);
    dest.writeString(this.Account);
    dest.writeString(this.name);
    dest.writeString(this.password);
    dest.writeInt(this.kind);
    dest.writeString(this.desc);
}
// 讀數(shù)據(jù)進(jìn)行恢復(fù)
protected DataBean(Parcel in) {
    this.id = in.readInt();
    this.kind = in.readInt();
    this.password = in.readString();
    this.name = in.readString();
    this.Account = in.readString();
    this.desc = in.readString();
}

}
這樣就完成了對(duì)DataBean的序列化,使用的時(shí)候就可以通過(guò)Intent進(jìn)行傳遞了虏两。

//Activity傳遞對(duì)象,不管是實(shí)現(xiàn)哪個(gè)接口都是用如下方式傳遞
intent.putExtra("data",data);

//在另一個(gè)Activity中接收對(duì)象的方式分別是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載愧旦,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末定罢,一起剝皮案震驚了整個(gè)濱河市忘瓦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌引颈,老刑警劉巖耕皮,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝙场,居然都是意外死亡凌停,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門售滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)罚拟,“玉大人,你說(shuō)我怎么就攤上這事完箩〈退祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵弊知,是天一觀的道長(zhǎng)阻逮。 經(jīng)常有香客問我,道長(zhǎng)秩彤,這世上最難降的妖魔是什么叔扼? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮漫雷,結(jié)果婚禮上瓜富,老公的妹妹穿的比我還像新娘。我一直安慰自己降盹,他們只是感情好与柑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般价捧。 火紅的嫁衣襯著肌膚如雪每辟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天干旧,我揣著相機(jī)與錄音渠欺,去河邊找鬼。 笑死椎眯,一個(gè)胖子當(dāng)著我的面吹牛挠将,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播编整,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼舔稀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了掌测?” 一聲冷哼從身側(cè)響起内贮,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汞斧,沒想到半個(gè)月后夜郁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粘勒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年竞端,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庙睡。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事富,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乘陪,到底是詐尸還是另有隱情统台,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布啡邑,位于F島的核電站贱勃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谣拣。R本人自食惡果不足惜募寨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望森缠。 院中可真熱鬧,春花似錦仪缸、人聲如沸贵涵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宾茂。三九已至瓷马,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨晴,已是汗流浹背欧聘。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留端盆,地道東北人怀骤。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像焕妙,于是被迫代替她去往敵國(guó)和親蒋伦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,499評(píng)論 25 707
  • JAVA序列化機(jī)制的深入研究 對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整...
    時(shí)待吾閱讀 10,837評(píng)論 0 24
  • 我把窗戶關(guān)上焚鹊,開了風(fēng)扇痕届。 洪老師說(shuō):“外面有風(fēng)啊,”一邊打開窗戶末患,“你看研叫!”一回頭,“哦不對(duì)璧针,原來(lái)是風(fēng)扇…”
    雪杉非狐閱讀 191評(píng)論 2 2
  • “嘿蓝撇,他們說(shuō)你喜歡我〕旅В” 小七坐在W對(duì)面渤昌,看著他說(shuō)道,臉上漫不經(jīng)心走搁,心里緊張的要命独柑。畢竟,這種試探私植,她不擅長(zhǎng)忌栅。結(jié)果...
    Daosy_氵閱讀 143評(píng)論 0 0
  • 窈窕無(wú)心招惹風(fēng), 玄冥戲虐技思窮曲稼。 披肩落白堅(jiān)貞骨索绪, 昂首提胸氣貫空。 文/閑云 2017.01.18
    2b4c67af34a7閱讀 145評(píng)論 0 1