第十一周-序列化

一.對象序列化是什么情妖?

對象總是在運行時存在,當程序終止時诱担,對象也就無論如何也不存在了毡证。而序列化即提供了一種機制,通過將“對象持久化”蔫仙,可以讓對象在程序不運行時也能存在料睛。

二.對象序列化的用途是什么?

  1. java遠程方法調(diào)用(RMI):可以使得遠程對象的像在本機上存在一樣。當向遠程對象發(fā)送消息是恤煞,需要通過對象序列化來傳出參數(shù)和返回值屎勘。
  2. Java Beans:使用bean時需要在設計階段對它的狀態(tài)信息進行配置。這種狀態(tài)信息會保存下來居扒,并在程序啟動時進行恢復概漱。

三.保存和加載序列化對象

為了保存對象數(shù)據(jù),需要打開一個ObjectOutputStream對象:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("filename"))

為了保存對象喜喂,可以直接用ObjectOutputStream 的writeObject方法

Employee harry = new Employee("Harry Hacker",50000,1989,10,1);
out.writeObject(harry);

為了讀回對象瓤摧,首先要獲得一個ObjectInputStream對象:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("filename"))

然后,用readObject方法以這些對象寫入順序獲取他們:

Employee e1 = (Employee)in.readObject();

注意:保存和加載基本數(shù)據(jù)類型時夜惭,使用基本數(shù)據(jù)類型對應的方法姻灶,如int類型,使用writeInt和readInd诈茧。

四.序列化會持久化對象哪些內(nèi)容产喉?

1.對象序列化不僅保存了對象的“全景圖”,而且能追蹤對象對所包含的所有引用敢会,并保存那些對象曾沈;接著又能對對象內(nèi)每個引用進行追蹤,找到它的引用類鸥昏,以此類推塞俱,形成一個“對象網(wǎng)”。
2.對象序列化是以特殊格式存儲對象數(shù)據(jù)的吏垮,如果有興趣的可以深入了解“對象序列化的文件格式”障涯。這里只做簡單介紹:
存儲對象時,對象所屬類也必須要存儲膳汪。這個類的描述包括:

  • 類名
  • 序列化的版本唯一ID唯蝶,他是數(shù)據(jù)域類型和方法簽名的指紋。
  • 描述序列化方法的標志集遗嗽。
  • 對數(shù)據(jù)域的描述
    值得注意的點:任何類的完整的類描述符只保存一次粘我,后續(xù)描述符將引用它(通過序列化唯一ID)。

五.多對象引用的情況

基于“對象網(wǎng)”特性痹换,如果存在存在多個對象對同一個對象進行引用征字,如兩個經(jīng)理公用同一個秘書:

Employee harry = new Employee("Harry Hacker",50000,1989,10,1);
Manager carl = new Manager (...);
carl.setSecretary(harry);
Manager tony= new Manager (...);
tony.setSecretary(harry);

這種情況是無法通過保存對象的內(nèi)存地址來保證秘書是同一個人,因為當對象被重載時娇豫,他可能重新占據(jù)一塊新的地址匙姜。
序列化保證每個對象都是用同一個序列號保存。下面是它的算法:

  • 對遇到的每個對象引用都關(guān)聯(lián)一個序列號
  • 對于每個對象冯痢,讓第一次遇到時氮昧,保存其對象數(shù)據(jù)到輸出流中
  • 如果某個對象之前被保存過或详,那么只寫出“與之前保存的序列號為x的對象相同”
    在讀回對象時,則是反向操作:
  • 輸入流的對象郭计,在第一次遇到其序列號時構(gòu)建它,并使用流中數(shù)據(jù)進行初始化椒振,然后記錄序列號與對象之間的關(guān)聯(lián)
  • 當遇到“與之前保存的序列號為x的對象相同”標記時昭伸,獲取與這個序列號相同的引用
    注意:只是同一流中的同一對象會添加“與之前保存的序列號為x的對象相同”標記。不同流時無法保證的澎迎。

六.對象序列化的其他方法

上面只介紹了實現(xiàn)Serializable接口的常用序列化方法庐杨,序列化包括以下幾種方法:

  • 含有writeObject方法的類
  • 實現(xiàn)了Serializable接口的類
  • 實現(xiàn)了Externalizable接口的類

七.屏蔽對象中某些域的方式

有時候我們不希望對象所有的域都被序列化,如用戶的密碼字段夹供。
這種情況序列化提供了一個transient(瞬時)關(guān)鍵字灵份,通過對對象中的某些不想要序列化的域添加關(guān)鍵字,即可以保證域不被序列化
還有另外一種處理這種情況的方式--使用Externalizable序列化哮洽,后續(xù)會進行介紹

八.修改默認的序列化機制

通常我們不需要添加額外的方法填渠,Serializable序列化方式就可以自動實現(xiàn)對對象的序列化。但序列化機制也提供了另外一種方式鸟辅,來屏蔽自動序列化氛什,向默認的讀寫行為添加驗證或其他行為。

private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException;
private void writeObject(ObjectOutputStream in) throws IOException;

通常匪凉,在方法的內(nèi)部我們需要添加defaultWriteObject方法和defaultReadObject方法來保存和加載默認Serializable序列化方式中自動處理的字段(即非transient字段)枪眉,而對于transient字段,則需要通過writeObject方法和readObject方法來進行保存和加載(是的再层,你沒有看錯贸铜,transient字段只是無法被默認序列化方式保存和加載)。

九.Externalizable序列化方式

Externalizable序列化方式與Serializable序列化方式的不同點在于:

  1. Externalizable序列化方式不會自動完成序列化聂受,而需要自己定義那些域需要序列化蒿秦,Externalizable提供了兩個方法writeExternalreadExternal,分別顯式的保存和加載域饺饭。
  2. Externalizable序列化方式會調(diào)用構(gòu)造器渤早。對于Serializable對象,對象完全以它存儲的二進制位為基礎(chǔ)來構(gòu)造瘫俊,而Externalizable對象則會調(diào)用所有默認的構(gòu)造器(包括字段定義時的初始化鹊杖,如果無法加載出數(shù)據(jù),會初始化為null值)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扛芽,一起剝皮案震驚了整個濱河市骂蓖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌川尖,老刑警劉巖登下,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡被芳,警方通過查閱死者的電腦和手機缰贝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畔濒,“玉大人剩晴,你說我怎么就攤上這事∏肿矗” “怎么了赞弥?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趣兄。 經(jīng)常有香客問我绽左,道長,這世上最難降的妖魔是什么艇潭? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任拼窥,我火速辦了婚禮,結(jié)果婚禮上蹋凝,老公的妹妹穿的比我還像新娘闯团。我一直安慰自己,他們只是感情好仙粱,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布房交。 她就那樣靜靜地躺著,像睡著了一般伐割。 火紅的嫁衣襯著肌膚如雪候味。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天隔心,我揣著相機與錄音白群,去河邊找鬼。 笑死硬霍,一個胖子當著我的面吹牛帜慢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唯卖,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼粱玲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拜轨?” 一聲冷哼從身側(cè)響起抽减,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橄碾,沒想到半個月后卵沉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颠锉,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年史汗,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼掠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡停撞,死狀恐怖眉枕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怜森,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布谤牡,位于F島的核電站副硅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翅萤。R本人自食惡果不足惜恐疲,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望套么。 院中可真熱鬧培己,春花似錦、人聲如沸胚泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玷室。三九已至零蓉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穷缤,已是汗流浹背敌蜂。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留津肛,地道東北人章喉。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像身坐,于是被迫代替她去往敵國和親秸脱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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