java序列化(Serializable)

1、什么是java序列化(Serializable)

Java 序列化技術(shù)可以使你將一個對象的狀態(tài)寫入一個Byte 流里,并且可以從其它地方把該Byte 流里的數(shù)據(jù)讀出來,重新構(gòu)造一個相同的對象。這種機制允許你將對象通過網(wǎng)絡(luò)進(jìn)行傳播,并可以隨時把對象持久化到數(shù)據(jù)庫、文件等系統(tǒng)里。Java的串行化機制是RMI、EJB等技術(shù)的技術(shù)基礎(chǔ)。用途:利用對象的串行化實現(xiàn)保存應(yīng)用程序的當(dāng)前工作狀態(tài),下次再啟動的時候?qū)⒆詣拥鼗謴?fù)到上次執(zhí)行的狀態(tài)。

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化。可以對流化后的對象進(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題。

序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。

2、串行化的特點:

(1)如果某個類能夠被串行化,其子類也可以被串行化。如果該類有父類,則分兩種情況來考慮,如果該父類已經(jīng)實現(xiàn)了可串行化接口。則其父類的相應(yīng)字段及屬性的處理和該類相同;如果該類的父類沒有實現(xiàn)可串行化接口,則該類的父類所有的字段屬性將不會串行化。

(2)聲明為static和transient類型的成員數(shù)據(jù)不能被串行化。因為static代表類的狀態(tài), transient代表對象的臨時數(shù)據(jù);

(3)相關(guān)的類和接口:在java.io包中提供的涉及對象的串行化的類與接口有ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。

(1)ObjectOutput接口:它繼承DataOutput接口并且支持對象的串行化,其內(nèi)的writeObject()方法實現(xiàn)存儲一個對象。ObjectInput接口:它繼承DataInput接口并且支持對象的串行化,其內(nèi)的readObject()方法實現(xiàn)讀取一個對象。

(2)ObjectOutputStream類:它繼承OutputStream類并且實現(xiàn)ObjectOutput接口。利用該類來實現(xiàn)將對象存儲(調(diào)用ObjectOutput接口中的writeObject()方法)。ObjectInputStream類:它繼承InputStream類并且實現(xiàn)ObjectInput接口。利用該類來實現(xiàn)讀取一個對象(調(diào)用ObjectInput接口中的readObject()方法)。

對于父類的處理,如果父類沒有實現(xiàn)串行化接口,則其必須有默認(rèn)的構(gòu)造函數(shù)(即沒有參數(shù)的構(gòu)造函數(shù))。否則編譯的時候就會報錯。在反串行化的時候,默認(rèn)構(gòu)造函數(shù)會被調(diào)用。但是若把父類標(biāo)記為可以串行化,則在反串行化的時候,其默認(rèn)構(gòu)造函數(shù)不會被調(diào)用。這是為什么呢?這是因為Java 對串行化的對象進(jìn)行反串行化的時候,直接從流里獲取其對象數(shù)據(jù)來生成一個對象實例,而不是通過其構(gòu)造函數(shù)來完成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容