Serializable接口

Serializable接口:
一個對象序列化的接口,一個類只有實現(xiàn)了Serializable接口轨淌,它的對象才能被序列化

一艳汽、什么是序列化壶愤?
【將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程,在序列化期間乔夯,對象將其當前狀態(tài)寫入到臨時存儲區(qū)或持久性存儲區(qū)砖织,之后,便可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài)信息末荐,來重新創(chuàng)建該對象】

序列化將數(shù)據(jù)分解成字節(jié)流侧纯,以便存儲在文件中或在網(wǎng)絡上傳輸。
反序列化就是打開字節(jié)流并重構(gòu)對象甲脏。

二眶熬、什么情況下需要序列化?
【當我們需要把對象的狀態(tài)信息通過網(wǎng)絡進行傳輸块请,或者需要將對象的狀態(tài)信息持久化娜氏,以便將來使用時都需要把對象進行序列化】

三、Serializable主要用來支持兩種主要的特性:
1墩新、Java的RMI(remote method invocation)贸弥,RMI允許像在本機上一樣操作遠程機器上的對象,當發(fā)送消息給遠程對象時抖棘,就需要用到序列化機制來發(fā)送參數(shù)和接受返回值茂腥。
2、Java的JavaBean切省,Bean的狀態(tài)信息通常是在設計時配置的最岗,Bean的狀態(tài)信息必須被保存下來,以便當程序運行時能恢復這些狀態(tài)信息朝捆,這也需要序Serializable機制般渡。

只需要了解被序列化的類需要實現(xiàn) Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 進行對象的讀寫。

四驯用、常出現(xiàn)的情景
1脸秽、兩個類A B代碼完全相同,試圖通過網(wǎng)絡傳遞對象數(shù)據(jù)蝴乔,A 端將對象 C 序列化為二進制數(shù)據(jù)再傳給 B记餐,B 反序列化得到 C。但一直反序列化不成功薇正。

解決:虛擬機是否允許反序列化片酝,不僅取決于類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)挖腰。雖然兩個類的功能代碼完全一致雕沿,但是序列化 ID 不同,他們無法相互序列化和反序列化猴仑。

I舐帧!A伤住<苍!榆苞!
序列化 ID 在 Eclipse 下提供了兩種生成策略稳衬,
(1)固定的 1L(一般這么做∽可以確保代碼一致時反序列化成功)

private static final long serialVersionUID = 1L;

(2)一個是隨機生成一個不重復的 long 類型數(shù)據(jù)(作用是:通過改變序列化 ID 可以用來限制某些用戶的使用薄疚。)

2、Facade外觀模式:
Client 端通過 Fa?ade Object 才可以與業(yè)務邏輯對象進行交互赊琳。而客戶端的 Fa?ade Object 不能直接由 Client 生成街夭,而是需要 Server 端生成,然后序列化后通過網(wǎng)絡將二進制對象數(shù)據(jù)傳給 Client躏筏,Client 負責反序列化得到 Fa?ade 對象板丽。

即 服務端(生成Facade object)序列化 ----->客戶端(反序列化,得到Facade對象趁尼,可用其與業(yè)務邏輯對象交互)

該模式可以使得 Client 端程序的使用需要服務器端的許可埃碱,同時 Client 端和服務器端的 Fa?ade Object 類需要保持一致。當服務器端想要進行版本更新時酥泞,只要將服務器端的 Fa?ade Object 類的序列化 ID 再次生成砚殿,當 Client 端反序列化 Fa?ade Object 就會失敗,也就是強制 Client 端從服務器端獲取最新程序芝囤。

3似炎、一個類實現(xiàn)了序列化辛萍,并且有其靜態(tài)變量。
但序列化保存的是對象的狀態(tài)羡藐,靜態(tài)變量屬于類的狀態(tài)贩毕,因此 序列化并不保存靜態(tài)變量。

4仆嗦、父類的序列化與transient:
父類不實現(xiàn)序列化辉阶,子類實現(xiàn)序列化,則將子類對象反序列化后輸出父類定義的某變量的數(shù)值欧啤,該變量數(shù)值與序列化時的數(shù)值不同睛藻。

原因:一個java對象的構(gòu)造必須先有父對象启上,再有子對象邢隧,反序列化也是,父類沒有實現(xiàn)序列化冈在,則虛擬機不會序列化父類倒慧。

解決:
a、父類也實現(xiàn)序列化
b包券、為父類創(chuàng)造默認的無參的構(gòu)造方法纫谅,在父類無參構(gòu)造方法中對父類進行變量初始化。則反序列化時溅固,構(gòu)造父對象時只能調(diào)用父類無參構(gòu)造函數(shù)為默認父對象付秕,如果不先在無參構(gòu)造函數(shù)中初始化變量,則父類變量值都會是默認聲明值侍郭,如0询吴,null。

所以亮元,使變量不被序列化的方法有
a猛计、Transient 關鍵字的作用是控制變量的序列化,在變量聲明前加上該關鍵字爆捞,可以阻止該變量被序列化到文件中奉瘤,在被反序列化后,transient 變量的值被設為初始值煮甥,如 int 型的是 0盗温,對象型的是 null。
b成肘、可以將不需要被序列化的字段抽取出來放到父類中卖局,子類實現(xiàn)序列化,父類不實現(xiàn)艇劫,則父類的字段數(shù)據(jù)將不會被序列化吼驶。

5惩激、對敏感字段加密
服務端給客戶端發(fā)送序列化對象數(shù)據(jù),并在序列化時進行加密蟹演,客戶端用解密密鑰风钻,在反序列化時,對密碼讀取酒请,保證了序列化對象的數(shù)據(jù)安全骡技。

在序列化過程中,虛擬機會試圖調(diào)用對象類里的 writeObject 和 readObject 方法羞反,進行用戶自定義的序列化和反序列化布朦,如果沒有這樣的方法,則默認調(diào)用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法昼窗。用戶自定義的 writeObject 和 readObject 方法可以允許用戶控制序列化的過程是趴,比如可以在序列化的過程中動態(tài)改變序列化的數(shù)值〕尉基于這個原理唆途,可以在實際應用中得到使用,用于敏感字段的加密工作。

如RMI技術(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛇捌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子温赔,更是在濱河造成了極大的恐慌,老刑警劉巖鬼癣,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陶贼,死亡現(xiàn)場離奇詭異,居然都是意外死亡扣溺,警方通過查閱死者的電腦和手機骇窍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥余,“玉大人腹纳,你說我怎么就攤上這事∏蹋” “怎么了嘲恍?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雄驹。 經(jīng)常有香客問我佃牛,道長,這世上最難降的妖魔是什么医舆? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任俘侠,我火速辦了婚禮象缀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷速。我一直安慰自己央星,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布惫东。 她就那樣靜靜地躺著莉给,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廉沮。 梳的紋絲不亂的頭發(fā)上颓遏,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音滞时,去河邊找鬼叁幢。 笑死,一個胖子當著我的面吹牛漂洋,可吹牛的內(nèi)容都是我干的遥皂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼刽漂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弟孟?” 一聲冷哼從身側(cè)響起贝咙,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拂募,沒想到半個月后庭猩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陈症,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年蔼水,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录肯。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡趴腋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出论咏,到底是詐尸還是另有隱情优炬,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布厅贪,位于F島的核電站蠢护,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏养涮。R本人自食惡果不足惜葵硕,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一眉抬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懈凹,春花似錦吐辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至威沫,卻和暖如春贤惯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棒掠。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工孵构, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烟很。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓颈墅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雾袱。 傳聞我的和親對象是個殘疾皇子恤筛,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)芹橡,斷路器毒坛,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 序言 將 Java 對象序列化為二進制文件的 Java 序列化技術(shù)是 Java 系列技術(shù)中一個較為重要的技術(shù)點,在...
    martin6699閱讀 359評論 0 1
  • 一林说、 序列化和反序列化概念 Serialization(序列化)是一種將對象以一連串的字節(jié)描述的過程煎殷;反序列化de...
    步積閱讀 1,437評論 0 10
  • 1. 介紹 序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)母袷降倪^程。 反序列化 ...
    郭尋撫閱讀 8,463評論 1 10
  • 晚上教兒子拼音腿箩,真心感受到老師的不容易豪直,不管是聲調(diào)還是拼寫,一直教一直教珠移,舉了好多例子弓乙,反復說了遍,還是模...
    劉軒卓爸爸閱讀 200評論 4 3