Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。
給你學習路線:html-css-js-jq-javase-數據庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。
小編推薦一個學Java的學習裙【 七六零,二五零,五四一 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
將序列化對象寫入文件之后,可以從文件中讀取出來,并且對它進行反序列化,也就是說,對象的類型信息、對象的數據,還有對象中的數據類型可以用來在內存中新建對象。
整個過程都是Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象。
類ObjectInputStream 和 ObjectOutputStream 是高層次的數據流,它們包含序列化和反序列化對象的方法。
ObjectOutputStream 類包含很多寫方法來寫各種數據類型,但是一個特別的方法例外:
上面的方法序列化一個對象,并將它發送到輸出流。相似的ObjectInputStream 類包含如下反序列化一個對象的方法:
該方法從流中取出下一個對象,并將對象反序列化。它的返回值為Object,因此,你需要將它轉換成合適的數據類型。
為了演示序列化在Java中是怎樣工作的,我將使用之前教程中提到的Employee類,假設我們定義了如下的Employee類,該類實現了Serializable 接口。
請注意,一個類的對象要想序列化成功,必須滿足兩個條件:
該類必須實現java.io.Serializable 對象。
該類的所有屬性必須是可序列化的。如果有一個屬性不是可序列化的,則該屬性必須注明是短暫的。
如果你想知道一個Java 標準類是否是可序列化的,請查看該類的文檔。檢驗一個類的實例是否能序列化十分簡單, 只需要查看該類有沒有實現 java.io.Serializable接口。
小編推薦一個學Java的學習裙【 七六零,二五零,五四一 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
序列化對象
ObjectOutputStream 類用來序列化一個對象,如下的 SerializeDemo 例子實例化了一個 Employee 對象,并將該對象序列化到一個文件中。
該程序執行后,就創建了一個名為employee.ser 文件。該程序沒有任何輸出,但是你可以通過代碼研讀來理解程序的作用。
注意: 當序列化一個對象到文件時, 按照 Java 的標準約定是給文件一個 .ser 擴展名。
反序列化對象
下面的DeserializeDemo 程序實例了反序列化,/tmp/employee.ser 存儲了 Employee 對象。
以上程序編譯運行結果如下所示:
這里要注意以下要點:
readObject() 方法中的 try/catch代碼塊嘗試捕獲 ClassNotFoundException 異常。對于 JVM 可以反序列化對象,它必須是能夠找到字節碼的類。如果JVM在反序列化對象的過程中找不到該類,則拋出一個 ClassNotFoundException 異常。
小編推薦一個學Java的學習裙【 七六零,二五零,五四一 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
注意,readObject() 方法的返回值被轉化成 Employee 引用。
當對象被序列化時,屬性SSN 的值為 111222333,但是因為該屬性是短暫的,該值沒有被發送到輸出流。所以反序列化后 Employee 對象的 SSN 屬性為 0。
無論是實現Serializable接口,或是Externalizable接口,當從I/O流中讀取對象時,readResolve()方法都會被調用到。實際上就是用readResolve()中返回的對象直接替換在反序列化過程中創建的對象。