Java序列化

什么是序列化

有對象存儲在內(nèi)存中都是短暫的申尤,為了把對象狀態(tài)保存下來,就需要吧對象存儲到磁盤或者其他介質(zhì)中犹菇,這個過程就叫做序列化妹懒。先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流

什么是反序列化

反序列化是序列化的反操作野哭,就是將存儲在磁盤或者其他介質(zhì)的對象 反序列化(讀任对摺)
到內(nèi)存中,待我們內(nèi)存中使用

Serializble

Serializable 是Java 提供的空的序列化接口虐拓,專門為對象提供標準序列化和反序列的操作心俗。
使用Serializable實現(xiàn)類的序列化比較簡單,
只要在類聲明中實現(xiàn) Serializable 接口即可蓉驹,同時強烈建議聲明序列化標識城榛。
serialVersionUID
serialVersionUID是在序列化和反序列化表示 是否是同一版本的類。
實際上對象在序列化時會自動生成serialVersionUID态兴,但是為什么還要我們定義一個
原因:serialVersionUID是用來輔助序列化和反序列化過程的狠持,原則上序列化后的對象中serialVersionUID
只有和當前類的serialVersionUID相同才能夠正常被反序列化,也就是說序列化與反序列化的serialVersionUID
必須相同才能夠使序列化操作成功瞻润。具體過程是這樣的:序列化操作的時候系統(tǒng)會把當前類的serialVersionUID寫入到序列化文件中喘垂,當反序列化時系統(tǒng)會去檢測文件中的serialVersionUID,判斷它是否與當前類的serialVersionUID一致绍撞,如果一致就說明序列化類的版本與當前類版本是一樣的正勒,可以反序列化成功,否則失敗傻铣。報出如UID錯誤章贞。如果不指定的話只要這個文件多
一個空格,系統(tǒng)自動生成的UID就會截然不同的非洲,反序列化也就會失敗

1.如果反序列類的成員變量的類型或者類名鸭限,發(fā)生了變化,那么即使serialVersionUID相同也 無法正常反序列化成功

2.靜態(tài)成員變量屬于類不屬于對象两踏,不會參與序列化過程败京,使用transient關鍵字標記的成員變量也不參與序列化過程

控制系統(tǒng)的默認序列化和反序列過程
public class User implements Serializable {

    private static final long serialVersionUID = -4083503801443301445L;

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    /**
     * 序列化時,
     * 首先系統(tǒng)會先調(diào)用writeReplace方法,在這個階段,
     * 可以進行自己操作,將需要進行序列化的對象換成我們指定的對象.
     * 一般很少重寫該方法
     */
    private Object writeReplace() throws ObjectStreamException {
        System.out.println("writeReplace invoked");
        return this;
    }
    /**
     *接著系統(tǒng)將調(diào)用writeObject方法,
     * 來將對象中的屬性一個個進行序列化,
     * 我們可以在這個方法中控制住哪些屬性需要序列化.
     * 這里只序列化name屬性
     */
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        System.out.println("writeObject invoked");
        out.writeObject(this.name == null ? "默認值" : this.name);
    }

    /**
     * 反序列化時,系統(tǒng)會調(diào)用readObject方法,將我們剛剛在writeObject方法序列化好的屬性,
     * 反序列化回來.然后通過readResolve方法,我們也可以指定系統(tǒng)返回給我們特定的對象
     * 可以不是writeReplace序列化時的對象,可以指定其他對象.
     */
    private void readObject(java.io.ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        System.out.println("readObject invoked");
        this.name = (String) in.readObject();
        System.out.println("got name:" + name);
    }


    /**
     * 通過readResolve方法,我們也可以指定系統(tǒng)返回給我們特定的對象
     * 可以不是writeReplace序列化時的對象,可以指定其他對象.
     * 一般很少重寫該方法
     */
    private Object readResolve() throws ObjectStreamException {
        System.out.println("readResolve invoked");
        return this;
    }
}

Parcelable

鑒于Serializable在內(nèi)存序列化上開銷比較大,而內(nèi)存資源屬于android系統(tǒng)中的稀有
資源(android系統(tǒng)分配給每個應用的內(nèi)存開銷都是有限的)梦染,為此android中提供了Pa
rcelable接口來實現(xiàn)序列化操作赡麦,Parcelable的性能比Serializable好,在內(nèi)存開銷方
面較小弓坞,所以在內(nèi)存間數(shù)據(jù)傳輸時推薦使用Parcelable隧甚,

Parcelable與Serializable 區(qū)別

  1. 存儲媒介不同
Seriaizable 使用IO讀寫存儲的硬盤上
Parcelable  直接在內(nèi)存中讀寫
很明顯內(nèi)存的讀寫速度通常大于IO讀寫车荔,所以在Android中通常優(yōu)先選擇Parcelable渡冻。
  1. 序列化方式不同
Serializable 使用反射,序列化和反序列化需要使用大量IO操作
Parcelable  自己實現(xiàn)封裝傳送和解封接收忧便,數(shù)據(jù)存放在內(nèi)存中族吻,因此效率快的多
Serializable更實用存儲讀寫操作帽借,Parcelable適用于數(shù)據(jù)傳遞
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市超歌,隨后出現(xiàn)的幾起案子砍艾,更是在濱河造成了極大的恐慌,老刑警劉巖巍举,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆荷,死亡現(xiàn)場離奇詭異,居然都是意外死亡懊悯,警方通過查閱死者的電腦和手機蜓谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炭分,“玉大人桃焕,你說我怎么就攤上這事∨趺” “怎么了观堂?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呀忧。 經(jīng)常有香客問我师痕,道長,這世上最難降的妖魔是什么而账? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任七兜,我火速辦了婚禮,結果婚禮上福扬,老公的妹妹穿的比我還像新娘腕铸。我一直安慰自己,他們只是感情好铛碑,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布狠裹。 她就那樣靜靜地躺著,像睡著了一般汽烦。 火紅的嫁衣襯著肌膚如雪涛菠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天撇吞,我揣著相機與錄音俗冻,去河邊找鬼。 笑死牍颈,一個胖子當著我的面吹牛迄薄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播煮岁,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼讥蔽,長吁一口氣:“原來是場噩夢啊……” “哼涣易!你這毒婦竟也來了?” 一聲冷哼從身側響起冶伞,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤新症,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后响禽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒爹,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年芋类,在試婚紗的時候發(fā)現(xiàn)自己被綠了瀑焦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡梗肝,死狀恐怖榛瓮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巫击,我是刑警寧澤禀晓,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站坝锰,受9級特大地震影響粹懒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顷级,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一凫乖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弓颈,春花似錦帽芽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纤子,卻和暖如春搬瑰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背控硼。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工泽论, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卡乾。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓翼悴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親说订。 傳聞我的和親對象是個殘疾皇子抄瓦,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

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

  • 如果你只知道實現(xiàn) Serializable 接口的對象潮瓶,可以序列化為本地文件陶冷。那你最好再閱讀該篇文章钙姊,文章對序列化...
    jiangmo閱讀 481評論 0 2
  • Java序列化 1. 什么是序列化? 序列化是將一個對象的狀態(tài)埂伦,各屬性的值序列化保存起來煞额,然后在合適的時候通過反序...
    王小冬閱讀 144評論 0 0
  • Java中的RPC(遠程服務調(diào)用)可以通過Serializable的方式進行。 序(序列化和反序列化) 是什么沾谜?為...
    小胖學編程閱讀 1,141評論 0 6
  • 什么是Java序列化膊毁? 持久化內(nèi)存中的對象到硬件設備,會把其狀態(tài)保存為一組字節(jié)基跑,在未來婚温,再將這些字節(jié)組裝成對象,這...
    官先生Y閱讀 292評論 1 0
  • “同學們請安靜媳否!”喧鬧的教室頓時安靜下來栅螟,老班拍了拍教尺,“給大家介紹一個新同學篱竭×ν迹”“新同學?男的女的掺逼?”“都快期...
    林意閱讀 490評論 6 3