[九]JavaIO之ObjectInputStream 和 ObjectOutputStream



序列化

序列化是指把Java對象保存為二進制字節碼的過程,Java反序列化是指把二進制碼重新轉換成Java對象的過程
序列化是一種輕量級的持久化,對象都是存活在內存中的,當JVM運行結束,對象便不存在了
如果想要對象還能夠存在,或者說當你在網絡中想要進行對象數據的傳輸的話,就需要進行序列化
說白了就是內存中的數據你要把他變成字節

ObjectInputStream 和 ObjectOutputStream就是java原生的用於處理序列化的功能

image_5b985d72_5a7c
image_5b985d72_19ca


ObjectStreamConstants 寫入 Object Serialization Stream 的常量
比如http請求似的,會有很多附加信息請求頭,class文件有他的文件信息類似的道理
序列化也會寫入一些除了直接數據信息以外的格式等相關的信息
這部分常量的值就在這個接口中
DataInput 接口用於從二進制流中讀取字節,並根據所有 Java 基本類型數據進行重構
ObjectInput
DataInput 包括基本類型的輸入方法
擴展了DataInput接口,以包含對象、數組和 String 
DataOutput
接口用於將數據從任意 Java 基本類型轉換為一系列字節,並將這些字節寫入二進制流
ObjectOutput
DataOutput 包括基本類型的輸出方法;
擴展了DataOutput接口,以包含對象、數組和 String 

從上面的類層次結構以及其他輔助類的說明上可以看得出來
ObjectStreamConstants 約定了所有序列化時用到的常量信息
DataInput以及ObjectInput 都是接口,約定了從二進制讀取基本類型 對象 數組 String的方法
DataOutput以及 ObjectOutput也都是接口,約定了將基本類型數據 對象  數組 String  轉換為字節寫入二進制流的方法
ObjectInputStream 和 ObjectOutputStream 相當於繼承了兩個體系
一個體系是IO的讀寫方法約定
另一個是從二進制讀取為數據或者數據編寫二進制

兩個體系結構的實現,構成了現在的ObjectInputStream 和 ObjectOutputStream
從下圖看得出來
除了標記的以外,其中絕大多數方法都來自於DataInput     DataOutput
image_5b985d72_6cd4


可以看一下關於DataInputStream以及DataOutputStream的介紹
其實完全可以看得出來,DataInputStream以及DataOutputStream他們兩個也算是序列化
只不過他們不支持對象  數組 String 僅僅支持基本類型,功能不夠強大,使用也不夠方便
java原生的序列化不就是  基本類型/對象/數組/String  與 二進制字節流的相互轉換嘛


ObjectInputStream

ObjectInputStream中的方法大多依賴於bin變量.
image_5b985d72_4f8a
比如:
image_5b985d72_27db
構造方法中會創建 bin
image_5b985d72_21be

bin 他是DataInputStream的內部類 BlockDataInputStream
BlockDataInputStream內部還有兩個變量分別是
DataInputStream 和PeekInputStream
image_5b985d72_5f03
其中的PeekInputStream也是內部類
image_5b985d72_4c19
輸入流有兩種模式:
在默認模式下,輸入數據以與DataOutputStream相同的格式寫入;
在“塊數據”模式中,輸入數據由塊數據標記括起來(詳細信息見對象序列化規范)。
緩沖依賴於塊數據模式:在默認模式下,沒有預先緩沖任何數據;當在塊數據模式下,當前數據塊的所有數據都立即讀取(並緩沖)
標記位是DataBlockInputStream中的blkmode

image_5b985d72_6513
在BlockDataInputStream中的方法,會根據這個標志位調用不同的方法
比如
image_5b985d72_4ca5
總結:
ObjectInputStream中的方法很多調用BlockDataInputStream
BlockDataInputStream又會根據模式blkmode 的值去調用實際的方法

可能是BlockDataInputStream自己實現的方法
也可能是PeekInputStream實現的方法


ObjectOutputStream

ObjectOutputStream的整體思路其實也是類似於ObjectInputStream的
它內部也有一個跟BlockDataInputStream  對應的BlockDataOutputStream
不再詳細介紹



總結

ObjectInputStream 和 ObjectOutputStream 是java原生的序列化以及反序列化類
算是DataInputStream和DataOutputStream的超集(功能上的超集,不是父類)
DataXXX只能處理基本類型,ObjectXXX可以處理 基本類型以及對象 數組 String

DataInput/ObjectInput
DataOutput/ObjectOutput
這四個接口定義了序列化的協議,各種方法的定義
ObjectInputStream 和 ObjectOutputStream  遵循了IO InputStream 和 OutputStream的約定,提供IO的讀寫方式
並且遵守了DataOutput/ObjectOutput的約定,提供了更多的可以用於 數據與二進制字節轉換的讀寫方法
實際開發使用時只需要關注可以使用的方法即可

ObjectInputStream 和 ObjectOutputStream可以理解為實現了序列化的功能的一個工具
所以你必須依托於InputStream 或者OutputStream
通常是和FileInputStream 和 FileOutputStream配合進行使用的
看一下他們的構造方法你就知道了 
image_5b985f69_7613

image_5b985f69_6b20


免責聲明!

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



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