1. 程式人生 > >Java序列化詳解

Java序列化詳解

啟用 協議 pri edi ado class 反序 標記 自動

轉載請註明原文地址: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序列化詳解