序列化
序列化是指把Java對象保存爲二進制字節碼的過程,Java反序列化是指把二進制碼從新轉換成Java對象的過程
序列化是一種輕量級的持久化,對象都是存活在內存中的,當JVM運行結束,對象便不存在了
若是想要對象還可以存在,或者說當你在網絡中想要進行對象數據的傳輸的話,就須要進行序列化
說白了就是內存中的數據你要把他變成字節
ObjectInputStream 和 ObjectOutputStream就是java原生的用於處理序列化的功能
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 |
|
能夠看一下關於DataInputStream以及DataOutputStream的介紹
其實徹底能夠看得出來,DataInputStream以及DataOutputStream他們兩個也算是序列化
只不過他們不支持對象 數組 String 僅僅支持基本類型,功能不夠強大,使用也不夠方便
java原生的序列化不就是 基本類型/對象/數組/String 與 二進制字節流的相互轉換嘛
|
ObjectInputStream
ObjectInputStream中的方法大多依賴於bin變量.
|
好比: |
構造方法中會建立 bin
bin 他是DataInputStream的內部類 BlockDataInputStream BlockDataInputStream內部還有兩個變量分別是 DataInputStream 和PeekInputStream |
其中的PeekInputStream也是內部類 |
輸入流有兩種模式: 在默認模式下,輸入數據以與DataOutputStream相同的格式寫入; 在「塊數據」模式中,輸入數據由塊數據標記括起來(詳細信息見對象序列化規範)。 緩衝依賴於塊數據模式:在默認模式下,沒有預先緩衝任何數據;當在塊數據模式下,當前數據塊的全部數據都當即讀取(並緩衝) 標記位是DataBlockInputStream中的blkmode
在BlockDataInputStream中的方法,會根據這個標誌位調用不一樣的方法 好比 |
總結: 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配合進行使用的
看一下他們的構造方法你就知道了