Java序列化面試題


歡迎關注
CSDN:程序員小羊
微信公眾號:程序員小羊
博客園:程序員小羊

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 接口,然后把對象(實際上只是對象的一個拷貝)寫到一個流里,再從流里讀出來,便可以重建對象。

歡迎關注
CSDN:程序員小羊
微信公眾號:程序員小羊
博客園:程序員小羊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM