Java序列化詳解
轉載請註明原文地址:https://www.cnblogs.com/ygj0930/p/10857597.html
一:什麽是序列化與反序列化
序列化:對象序列化是指將Java對象(動態的狀態,如變量、函數)轉換為字節流的過程,可以將其保存到磁盤文件中或通過網絡發送到任何其他程序。
反序列化:從字節流重構出Java對象的過程。
序列化得到的字節流是與平臺無關的,在一個平臺上序列化的對象可以在不同的平臺上反序列化。
二:序列化的作用
1)對象持久化
我們知道,對象隨著程序的運行而被創建,然後在不可達時被回收,生命周期是短暫的。但是如果我們想長久地把對象的內容保存起來怎麽辦呢?把它轉化為字節序列保存在存儲介質上即可。那就需要序列化。
2)網絡傳輸對象
我們知道,兩個進程之間通信時,傳遞的音頻、視頻等信息是以二進制序列形式來傳輸的。那麽,對象也可以嗎?可以,通過序列化把主機A進程上的對象序列化為二進制序列,傳輸到主機B上的進程從序列中重構出該對象。這在RMI中應用廣泛,RMI的結果可以是一個對象。
三:如何序列化
1、讓類對象可以被序列化
1)默認序列化方式
定義類時實現Serializable接口即可,這個Serializable接口是一個空接口,沒有需要實現的方法。
作用是標記該類的對象可以被序列化,啟用其序列化功能。通過調用 ObjectOutputStream和ObjectInputStream的方法來即可對該對象進行序列化和反序列化。
2)自定義類的序列化與反序列化接口:
定義類時,實現Serializable接口,並在類中重寫兩個序列化與反序列化接口,在其中定義對象序列化與反序列化動作。
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
這兩個方法,在方法中通過對象輸入流參數、對象輸出流參數進行自定義的內容輸出。
這樣通過 ObjectOutputStream和ObjectInputStream 序列化和反序列化對象時會自動調用類中定義的writeObject、和readObject方法而不是默認的序列化和反序列化方法。
2、序列化與反序列化API與使用過程
四:序列化底層原理
五:序列化的特殊情況
六:序列化破壞單例模式
七:為什麽說序列化並不安全
八:protobuf協議
九:其他序列化方式
Java序列化詳解