1、什麼是java序列化,如何實現java序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
2、保存(持久化)對象及其狀態到內存或者磁盤
Java 平臺允許我們在內存中創建可複用的 Java 對象,但一般情況下,只有當 JVM 處於運行時,這些對象纔可能存在,即,這些對象的生命週期不會比 JVM 的生命週期更長。 但在現實應用中,就可能要求在JVM停止運行之後能夠保存(持久化)指定的對象,並在將來重新讀取被保存的對象。Java 對象序列化就能夠幫助我們實現該功能。
3、序列化對象以字節數組保持-靜態成員不保存
使用 Java 對象序列化, 在保存對象時,會把其狀態保存爲一組字節,在未來, 再將這些字節組裝成對象。必須注意地是, 對象序列化保存的是對象的”狀態”,即它的成員變量。由此可知,對象序列化不會關注類中的靜態變量。
4、序列化用戶遠程對象傳輸
除了在持久化對象時會用到對象序列化之外,當使用 RMI(遠程方法調用),或在網絡中傳遞對象時,都會用到對象序列化。 Java序列化API爲處理對象序列化提供了一個標準機制,該API簡單易用。
5、Serializable 實現序列化
在 Java 中, 只要一個類實現了 java.io.Serializable 接口,那麼它就可以被序列化。ObjectOutputStream 和 ObjectInputStream 對對象進行序列化及反序列化通過 ObjectOutputStream 和 ObjectInputStream 對對象進行序列化及反序列化。
6、writeObject 和 readObject 自定義序列化策略
在類中增加 writeObject 和 readObject 方法可以實現自定義序列化策略。
7、序列化 ID
虛擬機是否允許反序列化,不僅取決於類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID
8、序列化並不保存靜態變量
序列化子父類說明 要想將父類對象也序列化,就需要讓父類也實現 Serializable 接口。
9、Transient 關鍵字阻止該變量被序列化到文件中
-
在變量聲明前加上 Transient 關鍵字,可以阻止該變量被序列化到文件中,在被反序列 化後, transient 變量的值被設爲初始值,如 int 型的是 0,對象型的是 null。
-
服務器端給客戶端發送序列化對象數據,對象中有一些數據是敏感的,比如密碼字符串 等,希望對該密碼字段在序列化時,進行加密,而客戶端如果擁有解密的密鑰,只有在 客戶端進行反序列化時,纔可以對密碼進行讀取,這樣可以一定程度保證序列化對象的 數據安全。
10、序列化(深 clone 一中實現)
在 Java 語言裏深複製一個對象,常常可以先使對象實現 Serializable 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。
實現 Serializable 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。
另外,還整理了一個整理了一本面試電子書,共 300頁!目錄如下
差不多花了大半個月在整理成冊,另外創建了一個比較大家關心的內推羣,自建立起就很受歡迎!羣裏目前有不少獵頭和各大互聯網公司HR,大多數來自,北京,上海,廣州,深圳,杭州,希望能給大家來帶幫助!
給俺點個讚唄,可以讓更多的人看到這篇文章,順便激勵下我,嘻嘻。
作者簡潔
作者:大家好,我是軍長,一如既往的爲廣大Java讀者奉獻MySQL、SSM、Redis、Spring,並且整理了300頁Java面試手冊,個人博客 全部是Java,分佈式,大數據的系列文章。 轉載說明:未獲得授權,禁止轉載