Java IO框架總攬–ObjectInputStream& ObjectOutputStream原始碼解讀

雨露發表於2019-01-19
ObjectInputStream與ObjectOutputStream的作用是:對基本資料和物件進行序列化操作進行支援。其中ObjectInputStream物件提供對基本資料和物件對持久儲存,當我們需要讀取這些儲存這些基本資料或物件時,可以建立檔案輸入流對應的ObjectInputStream,進而讀取這些基本資料或物件。

序列化有關的基礎知識:
1 需要序列化的類必須實現java.io.Serializable介面,否則會丟擲NotSerializableException異常。
2 如果檢測到反序列化的類的serialVersionUID和物件二進位制流的serialVersionUID不同,則會丟擲異常。
3 Java序列化會將一個類中包含的引用中的所有的成員變數儲存下來,所以裡面的引用型別也要實現java.io.Serializable的介面。
4 對於不用採用預設序列化或無需序列化的成員變數,可以新增transient關鍵字,並不是說新增了transient關鍵字就一定不能序列化。
5 每一個類可以實現readObject、writeObject等方法實現自己的序列化策略,即使是transient修飾的成員變數也可以手動呼叫ObjectOutputStream的write*等方法,將成員變數序列化。

ObjectOutputStream 有關方法

1 public ObjectOutputStream(OutputStream out) throws IOException {} 
* 建立一個ObjectOutputStream去寫入指定的OutputStream,此建構函式將序列化流頭寫入底層流,呼叫者需要立即重新整理流,以確保用於接收ObjectInputStreams的建構函式在讀取該頭時不會阻塞。

2 protected ObjectOutputStream() throws IOException, SecurityException {}
* 為完全重新實現ObjectOutputStream的子類提供一種方法,使其不必分配僅由ObjectOutputStream的實現使用的私有資料

3 public void useProtocolVersion(int version) throws IOException {}
* 指定在編寫流時使用的流協議版本

4  public final void writeObject(Object obj) throws IOException {}
* 將指定的物件寫入ObjutoExtStudio流,物件的類、類的簽名、類及其所有超型別的非瞬態和非靜態欄位的值都可以通過該方法寫入,重寫writeObject和readObject方法可以將預設的序列號重寫,該物件引用的物件是通過傳遞方式編寫的,以便ObjectInputStream可以重構等效的、完整的物件。

相關文章