歡迎關注
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 關鍵字阻止該變量被序列化到文件中
- 在變量聲明前加上 Transient 關鍵字,可以阻止該變量被序列化到文件中,在被反序列化后, transient 變量的值被設為初始值,如 int 型的是 0,對象型的是 null。
- 服務器端給客戶端發送序列化對象數據,對象中有一些數據是敏感的,比如密碼字符串等,希望對該密碼字段在序列化時,進行加密,而客戶端如果擁有解密的密鑰,只有在客戶端進行反序列化時,才可以對密碼進行讀取,這樣可以一定程度保證序列化對象的數據安全。
10、序列化(深 clone 一中實現)
在 Java 語言里深復制一個對象,常常可以先使對象實現 Serializable 接口,然后把對象(實際上只是對象的一個拷貝)寫到一個流里,再從流里讀出來,便可以重建對象。
歡迎關注
CSDN:程序員小羊
微信公眾號:程序員小羊
博客園:程序員小羊