Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言珍特。Java 技術(shù)具有卓越的通用性祝峻、高效性、平臺移植性和安全性,廣泛應(yīng)用于PC莱找、數(shù)據(jù)中心酬姆、游戲控制臺、科學(xué)超級計算機宋距、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群症脂。
給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
Java 提供了一種對象序列化的機制谚赎,該機制中,一個對象可以被表示為一個字節(jié)序列诱篷,該字節(jié)序列包括該對象的數(shù)據(jù)壶唤、有關(guān)對象的類型的信息和存儲在對象中數(shù)據(jù)的類型。
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 七六零棕所,二五零闸盔,五四一 】,無論你是大牛還是小白琳省,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)迎吵!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享针贬!
將序列化對象寫入文件之后击费,可以從文件中讀取出來,并且對它進行反序列化桦他,也就是說蔫巩,對象的類型信息、對象的數(shù)據(jù)快压,還有對象中的數(shù)據(jù)類型可以用來在內(nèi)存中新建對象圆仔。
整個過程都是Java 虛擬機(JVM)獨立的,也就是說蔫劣,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象坪郭。
類ObjectInputStream 和 ObjectOutputStream 是高層次的數(shù)據(jù)流,它們包含序列化和反序列化對象的方法脉幢。
ObjectOutputStream 類包含很多寫方法來寫各種數(shù)據(jù)類型截粗,但是一個特別的方法例外:
上面的方法序列化一個對象,并將它發(fā)送到輸出流鸵隧。相似的ObjectInputStream 類包含如下反序列化一個對象的方法:
該方法從流中取出下一個對象绸罗,并將對象反序列化。它的返回值為Object豆瘫,因此珊蟀,你需要將它轉(zhuǎn)換成合適的數(shù)據(jù)類型。
為了演示序列化在Java中是怎樣工作的,我將使用之前教程中提到的Employee類育灸,假設(shè)我們定義了如下的Employee類腻窒,該類實現(xiàn)了Serializable 接口。
請注意磅崭,一個類的對象要想序列化成功儿子,必須滿足兩個條件:
該類必須實現(xiàn)java.io.Serializable 對象。
該類的所有屬性必須是可序列化的砸喻。如果有一個屬性不是可序列化的柔逼,則該屬性必須注明是短暫的。
如果你想知道一個Java 標(biāo)準(zhǔn)類是否是可序列化的割岛,請查看該類的文檔愉适。檢驗一個類的實例是否能序列化十分簡單, 只需要查看該類有沒有實現(xiàn) java.io.Serializable接口癣漆。
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 七六零维咸,二五零,五四一 】惠爽,無論你是大牛還是小白癌蓖,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具婚肆,很多干貨和技術(shù)資料分享费坊!
序列化對象
ObjectOutputStream 類用來序列化一個對象,如下的 SerializeDemo 例子實例化了一個 Employee 對象旬痹,并將該對象序列化到一個文件中附井。
該程序執(zhí)行后,就創(chuàng)建了一個名為employee.ser 文件两残。該程序沒有任何輸出永毅,但是你可以通過代碼研讀來理解程序的作用。
注意: 當(dāng)序列化一個對象到文件時人弓, 按照 Java 的標(biāo)準(zhǔn)約定是給文件一個 .ser 擴展名沼死。
反序列化對象
下面的DeserializeDemo 程序?qū)嵗朔葱蛄谢?tmp/employee.ser 存儲了 Employee 對象。
以上程序編譯運行結(jié)果如下所示:
這里要注意以下要點:
readObject() 方法中的 try/catch代碼塊嘗試捕獲 ClassNotFoundException 異常崔赌。對于 JVM 可以反序列化對象意蛀,它必須是能夠找到字節(jié)碼的類。如果JVM在反序列化對象的過程中找不到該類健芭,則拋出一個 ClassNotFoundException 異常县钥。
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 七六零,二五零慈迈,五四一 】若贮,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具谴麦,很多干貨和技術(shù)資料分享蠢沿!
注意,readObject() 方法的返回值被轉(zhuǎn)化成 Employee 引用匾效。
當(dāng)對象被序列化時舷蟀,屬性SSN 的值為 111222333,但是因為該屬性是短暫的面哼,該值沒有被發(fā)送到輸出流野宜。所以反序列化后 Employee 對象的 SSN 屬性為 0。
無論是實現(xiàn)Serializable接口精绎,或是Externalizable接口速缨,當(dāng)從I/O流中讀取對象時锌妻,readResolve()方法都會被調(diào)用到代乃。實際上就是用readResolve()中返回的對象直接替換在反序列化過程中創(chuàng)建的對象。