[九]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
相關文章
相關標籤/搜索