對(duì)象的序列化與反序列化_第1頁
對(duì)象的序列化與反序列化_第2頁
對(duì)象的序列化與反序列化_第3頁
對(duì)象的序列化與反序列化_第4頁
對(duì)象的序列化與反序列化_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、對(duì)象的序列化與反序列化第1頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三本章內(nèi)容對(duì)象序列化與反序列化的基本概念實(shí)現(xiàn)序列化的基本過程 Serializable和Externalizable接口 ObjectOutputStream和ObjectInputStream自定義序列化的兩種方式默認(rèn)序列化方式與自定義序列化方式的比較序列化類不同版本的序列化兼容性第2頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三對(duì)象序列化對(duì)象序列化:將Java對(duì)象轉(zhuǎn)化成二進(jìn)制字節(jié)流的過程。對(duì)象反序列化: 將二進(jìn)制字節(jié)流恢復(fù)為Java對(duì)象的過程。對(duì)象序列化的主要用途:將對(duì)象的字節(jié)序列永久的保存到硬盤上,

2、通常存放在一個(gè)文件中。(2) 在網(wǎng)絡(luò)中傳輸對(duì)象的字節(jié)序列。第3頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三Serializable和Externalizable接口序列化的過程:只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對(duì)象才能進(jìn)行序列化操作。 Externalizable接口繼承自Serializable口, 實(shí)現(xiàn)Externalizable接口的類需要自行控制序列化的行為。 實(shí)現(xiàn)Serializable接口的類采用默認(rèn)的序列化方式。 JDK類庫中的部分類(String,封裝類和Date類等)都實(shí)現(xiàn)了Serializable接口。第4頁,共16頁,

3、2022年,5月20日,2點(diǎn)16分,星期三ObjectInputStream和ObjectOutputStream(2) 對(duì)象輸入和輸出流構(gòu)造方法:ObjectInputStream(InputStream in)ObjectOutputStream(OutputStream out) 見源文件:ObjectSerTest.java第5頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三ObjectInputStreamObjectInputStream按照默認(rèn)方式進(jìn)行反序列化時(shí),具有以下特點(diǎn):(1) 如果內(nèi)存中對(duì)象所屬的類還沒有加載,那么會(huì)加載并初始化這個(gè)類。如果在classpath中找

4、不到相應(yīng)的類文件,拋出ClassNotFoundException。(2) 在反序列化時(shí)不會(huì)調(diào)用類的任何構(gòu)造方法。第6頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三對(duì)象序列化注意的問題: (1) 序列化和反序列化的順序要一致 (2) 保存對(duì)象的文件名一般不要用.txt文件,換成.obj或.ser文件最好第7頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三對(duì)象序列化 ObjectOutputStream只能對(duì)實(shí)現(xiàn)了Serializable接口的類的對(duì)象進(jìn)行默認(rèn)的序列化操作,這種操作僅僅為對(duì)象的非transient和非static的實(shí)例變量進(jìn)行序列化。 見源文件:ObjectSe

5、rTest1.java 注意:靜態(tài)變量屬于類,不屬于對(duì)象。靜態(tài)變量在類加載的時(shí)候初始化,將含有靜態(tài)變量的對(duì)象的序列化和反序列化分開在不同的進(jìn)程中,以得到正確結(jié)果。 見源文件:WriteStudent.java ReadStudent.java 第8頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三transient成員變量transient變量不能被序列化,那么可以修飾以下類型的變量。(1) 實(shí)例變量不代表對(duì)象的固有的內(nèi)部數(shù)據(jù),僅僅代表具有一定邏輯含義的臨時(shí)數(shù)據(jù)。 . private String firstName; private String lastName; private t

6、ransient String fullName;(2) 實(shí)例變量表示一些比較敏感的信息(密碼等), 出于安全方面的原因不希望被序列化。(3) 實(shí)例變量需要按照用戶自定義的方式序列化,如經(jīng)過加密后再序列化。第9頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三具有關(guān)聯(lián)關(guān)系的對(duì)象之間的序列化Class Teacher implements Serializable private Set stu=new HashSet();當(dāng)序列化Teacher對(duì)象時(shí),系統(tǒng)還會(huì)序列化Teacher所關(guān)聯(lián)的其他可序列化的對(duì)象(Student對(duì)象)。 ABCEDGHF第10頁,共16頁,2022年,5月20日

7、,2點(diǎn)16分,星期三自定義序列化方式-Serializable接口自定義序列化方式,在可序列化類中定義下面兩個(gè)方法:private void writeObject(ObjectOutputStream out) throws IOExceptionprivate void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException 注意:上述兩個(gè)方法不是java.io.Serializable接口中定義的方法第11頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三自定義序列化方式-Serializ

8、able接口自定義序列化方式常用于以下情況:確保序列化的安全性,對(duì)敏感信息加密后再序列化,在反序列化時(shí)先解密。 見源文件: ObjSerSecurity.java(2)確保對(duì)象的成員變量符合正確的約束條件。 見源文件: ObjSerConstraint.java(3)能夠優(yōu)化序列化的性能 見源文件: ObjSerCapacity.java ObjSerOptimizeCapacity.java 注意:需要按自定義方式序列化的成員變量,是否定義為 transient類型無關(guān)緊要。第12頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三自定義序列化方式-Externalizable接口 Ex

9、ternalizable接口繼承自Serializable接口。如果一個(gè)類實(shí)現(xiàn)了Externalizable接口,那么將完全由這個(gè)類控制自身的序列化行為。 public void writeExternal(ObjectOutput out)throws IOException public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException 注意:對(duì)實(shí)現(xiàn)了Externalizable接口的類的對(duì)象進(jìn)行反序列化操作時(shí),會(huì)調(diào)用該類無參的構(gòu)造方法 見源文件:ObjExternalSer.java第1

10、3頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三默認(rèn)序列化與自定義序列化的比較默認(rèn)序列化方式的不足對(duì)象當(dāng)中的不易對(duì)外公開的敏感數(shù)據(jù)進(jìn)行序列化,安全性低。(2) 不會(huì)檢查對(duì)象的成員變量是否合乎正確的約束條件。(3) 默認(rèn)的序列化方式需要對(duì)對(duì)象圖進(jìn)行遞歸遍歷,如果對(duì)象圖很復(fù)雜,會(huì)消耗很多空間和時(shí)間,甚至引起Java虛擬機(jī)堆棧溢出。自定義序列化方式兩種:實(shí)現(xiàn)Serializable接口,并且提供private的writeObject()和readObject()。(2) 實(shí)現(xiàn)Externalizable接口,實(shí)現(xiàn)writeExternal()和readExternal()方法,必須提供public無參的構(gòu)造方法。第14頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三可序列化類的不同版本的序列化兼容性 實(shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)常量。 private static final long serialVersionUID;JDK安裝目錄的bin目錄下有個(gè)serialver.exe用于查看serialVersionUID。 用法:serialver 字節(jié)碼serialVersionUID依賴于內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)與編譯器。第15頁,共16頁,2022年,5月20日,2點(diǎn)16分,星期三可序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論