对象流及序列化
文章目錄
- 前言
- 對象流
- 序列化:
- 序列化的特點:
- serialVersionUID:序列化版本號
- 序列化的過程
- 反序列化:
- 反序列化的過程:
- 補充:
前言
使用對象和磁盤打交道的IO類是ObjectInputStream和ObjectOutputStream
而序列化和反序列化是對象是否可以使用對象流的關(guān)鍵
對象流
ObjectInputStream:對象輸入流:存入到磁盤中一個對象實體
ObjectOutputStream:對象輸出流:從瓷盤中取出一個對象實體
注意:對象流操作的對象需要 實現(xiàn)序列化。
序列化:
將對象實例保存到磁盤的過程就是序列化(ObjectOutputStream)
序列化的特點:
1、對象要能完成序列化和反序列化的對象必須實現(xiàn)Serializable接口 2、序列化和反序列化需要使用到IO類ObjectInputStream和ObjectOutputStream 3、虛擬機是否能支持序列化,也需要取決于serialVersionUID值 4、transient關(guān)鍵字是來控制變量的序列化,在變量前加關(guān)鍵,當(dāng)前的變量不參與序列化,反序列化中 transient關(guān)鍵字修飾的變量會給定初始值 如:int類型0,對象類型給定null值 5、要將父類對象也參與序列化,則就需要讓父類對象實現(xiàn)實現(xiàn)Serializable接口serialVersionUID:序列化版本號
serialVersionUID是一個標(biāo)識符,通常在對象的哈希碼序列化時會標(biāo)記在對象上
serialVersionUID生成方式:
1、一般可以是默認值1
2、另一種是類名、接口名、成員方法和屬性等生成的64位的哈希字段
作用是進行版本控制,當(dāng)對類添加或者修改類中的任何字段,已經(jīng)序列化的對象將無法恢復(fù),因為類已經(jīng)生成新的serialVersionUID,在進行反序列化時,會將當(dāng)前類的serialVersionUID和序列化的對象的serialVersionUID進行比較,如果不匹配,將拋出異常
序列化的過程
ObjectOutputStream outputStream = null;try {outputStream = new ObjectOutputStream(new FileOutputStream(path));outputStream.writeObject(o);outputStream.flush();} catch (IOException e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}反序列化:
將對象從磁盤中讀取出來的過程是反序列化(ObjectInputStream)
反序列化的過程:
ObjectInputStream inputStream = null;try {inputStream = new ObjectInputStream(new FileInputStream(path));Person person = (Person) inputStream.readObject();System.out.println(person);} catch (Exception e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}補充:
為什么Serializable接口沒有任何方法可以完成序列化:
我們通過查看ArrayList源碼來進行分析
在序列化過程中,如果被序列化的類實現(xiàn)了writeObject和readObject方法,虛擬機在調(diào)用對象類型的readObject 和writeObject是,會執(zhí)行到該類中的自定義的方法,如果類里面沒實現(xiàn)自定義的方法的話,ObjectOutputStream會調(diào)用默認的defaultWriteObject,或者ObjectInputStream中的defaultInputStream方法
transient:的作用:
比如:ArrayList中的elementDate屬性使用transient關(guān)鍵字修飾
ArrayList是一個動態(tài)數(shù)組,每次在放滿后都會動態(tài)的擴容設(shè)定一個長度值,如果設(shè)定數(shù)據(jù)長度為100,而實際存放1個有效數(shù)據(jù),那么會序列化99個null元素,為了保證序列化不將99個null值參與序列計劃,ArrayList設(shè)定為transient
elementDate在序列化是是將數(shù)據(jù)取出來進行序列化的
總結(jié)
- 上一篇: File类及相关方法介绍
- 下一篇: IO流中的设计模式