2020 最新Java序列化面試題

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 關鍵字阻止該變量被序列化到文件中

  1. 在變量聲明前加上 Transient 關鍵字,可以阻止該變量被序列化到文件中,在被反序列 化後, transient 變量的值被設爲初始值,如 int 型的是 0,對象型的是 null。

  2. 服務器端給客戶端發送序列化對象數據,對象中有一些數據是敏感的,比如密碼字符串 等,希望對該密碼字段在序列化時,進行加密,而客戶端如果擁有解密的密鑰,只有在 客戶端進行反序列化時,纔可以對密碼進行讀取,這樣可以一定程度保證序列化對象的 數據安全。

10、序列化(深 clone 一中實現)

在 Java 語言裏深複製一個對象,常常可以先使對象實現 Serializable 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。

實現 Serializable 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。

另外,還整理了一個整理了一本面試電子書,共 300頁!目錄如下


差不多花了大半個月在整理成冊,另外創建了一個比較大家關心的內推羣,自建立起就很受歡迎!羣裏目前有不少獵頭和各大互聯網公司HR,大多數來自,北京,上海,廣州,深圳,杭州,希望能給大家來帶幫助!

給俺點個讚唄,可以讓更多的人看到這篇文章,順便激勵下我,嘻嘻。

作者簡潔
作者:大家好,我是軍長,一如既往的爲廣大Java讀者奉獻MySQL、SSM、Redis、Spring,並且整理了300頁Java面試手冊個人博客 全部是Java,分佈式,大數據的系列文章。 轉載說明:未獲得授權,禁止轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章