《Java高級(jí)程序設(shè)計(jì)》課件-學(xué)習(xí)情境5 Java序列化機(jī)制_第1頁(yè)
《Java高級(jí)程序設(shè)計(jì)》課件-學(xué)習(xí)情境5 Java序列化機(jī)制_第2頁(yè)
《Java高級(jí)程序設(shè)計(jì)》課件-學(xué)習(xí)情境5 Java序列化機(jī)制_第3頁(yè)
《Java高級(jí)程序設(shè)計(jì)》課件-學(xué)習(xí)情境5 Java序列化機(jī)制_第4頁(yè)
《Java高級(jí)程序設(shè)計(jì)》課件-學(xué)習(xí)情境5 Java序列化機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java序列化機(jī)制一、應(yīng)用場(chǎng)景二、Java泛型的概念三、Java對(duì)象實(shí)現(xiàn)序列化的步驟四、Java實(shí)現(xiàn)反序列化的步驟本學(xué)習(xí)情境主要內(nèi)容3一、應(yīng)用場(chǎng)景在分布式環(huán)境下,當(dāng)進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳輸。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象。序列化常應(yīng)用于以下場(chǎng)景(1)永久性保存對(duì)象,保存對(duì)象的字節(jié)序列到本地文件或者數(shù)據(jù)庫(kù)中;(2)通過序列化以字節(jié)流的形式使對(duì)象在網(wǎng)絡(luò)中進(jìn)行傳遞和接收;(3)通過序列化在進(jìn)程間傳遞對(duì)象。二、Java序列化序列化的概念Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程,Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過程。Java序列化的幾種方式比較常見的做法有:采用Java對(duì)象的序列化和反序列化機(jī)制把對(duì)象包裝成JSON字符串傳輸采用Google的開源工具protoBuf。Java對(duì)象序列化機(jī)制Java對(duì)象的序列化和反序列化機(jī)制,是JavaJDK提供了一套API來(lái)支持Java對(duì)象序列化。其中包括序列化的接口和Input/Output流的相關(guān)類。本學(xué)習(xí)情境是采用Java對(duì)象序列化機(jī)制。java.io.Serializable接口java.io.Externalizable接口ObjectOutput接口ObjectInput接口ObjectOutputStream類ObjectInputStream類Serializable接口,表示一個(gè)類的可序列化性由實(shí)現(xiàn)Serializable接口的類啟用。未實(shí)現(xiàn)此接口的類的任何狀態(tài)都不會(huì)序列化或反序列化。序列化接口沒有方法或字段,僅用于標(biāo)識(shí)可序列化的語(yǔ)義。ObjectOutputStream類,代表對(duì)象輸出流,它的writeObject(Objectobj)方法可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中。ObjectInputStream類,代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)Java對(duì)象,并將其返回。定義一個(gè)類,并實(shí)現(xiàn)Serializable或Externalizable接口。實(shí)現(xiàn)Serializable接口只要讓Java類實(shí)現(xiàn)Serializable接口即可,無(wú)需實(shí)現(xiàn)任何方法。使用ObjectOutputStream的writeObject(Objectobj)方法和ObjectInputStream的readObject()方法,對(duì)序列化的Java對(duì)象進(jìn)行讀寫為字節(jié)輸出流和輸入流。Java提供對(duì)象序列化的方法三、Java對(duì)象實(shí)現(xiàn)序列化的步驟第一步,定義一個(gè)實(shí)體類,并實(shí)現(xiàn)Serializable接口publicclassEmployeeimplementsSerializable{}Employeeemployee=newEmployee();第二步,創(chuàng)建該類的對(duì)象Filefile=newFile(“物理文件”);第三步,創(chuàng)建邏輯文件第四步,創(chuàng)建文件輸出流FileOutputStreamfos=newFileOutputStream(file);第五步,創(chuàng)建對(duì)象輸出流,負(fù)責(zé)將對(duì)象寫入字節(jié)流ObjectOutputStreamoos=newObjectOutputStream(fos);第六步,通過對(duì)象輸出流寫入對(duì)象oos.writeObject(employee);第七步,關(guān)閉流oos.close();fos.close();四、Java實(shí)現(xiàn)反序列化的步驟第一步,定義一個(gè)實(shí)體類,并實(shí)現(xiàn)Serializable接口publicclassEmployeeimplementsSerializable{}Employeeemployee=newEmployee();使用無(wú)參的構(gòu)造函數(shù)創(chuàng)造一個(gè)實(shí)體類的對(duì)象第二步,創(chuàng)建該類的對(duì)象第三步,創(chuàng)建邏輯文件Filefile=newFile(“物理文件”);//構(gòu)造函數(shù)第四步,創(chuàng)建文件輸入流FileInputStreamfis=newFileInputStream(file);第五步,創(chuàng)建對(duì)象輸出流,負(fù)責(zé)將對(duì)象寫入字節(jié)流ObjectInputStreamiis=newObjectInputStream(fis);第六步,通過對(duì)象輸出流讀出對(duì)象并處理該對(duì)象employee=iis.readObject(employee);System.out.println(employee);第七步,關(guān)閉流iis.close();fis.close();小結(jié)Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程,而Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過程。常見的Java序列化方式有Java對(duì)象序列化機(jī)制和JSON字符串方式。Java對(duì)象序列化機(jī)制是使用Serializable接口。使用類ObjectInputStream和ObjectOutputStream的readObject()和writeObject()方法實(shí)現(xiàn)讀寫。Java序列化機(jī)制的使用實(shí)例一、任務(wù)描述二、任務(wù)分析、設(shè)計(jì)三、任務(wù)實(shí)施四、運(yùn)行結(jié)果本學(xué)習(xí)情境主要內(nèi)容27一、任務(wù)描述使用Java序列化機(jī)制編寫應(yīng)用程序任務(wù)需求將一個(gè)對(duì)象序列化后寫入到本地文件中然后反序列化后讀取顯示。二、任務(wù)分析、設(shè)計(jì)分析類Address類,該類描述員工的地址信息,實(shí)現(xiàn)Serializable接口。Employee類,該類描述員工的信息,實(shí)現(xiàn)Serializable接口,同時(shí)其引用了Address類,作為員工的地址。EmployeeSerializableTest類,序列化測(cè)試類。EmployeeDeserializedTest類,反序列化測(cè)試類。數(shù)據(jù)文件:D:\employee.dat其類圖如圖5-1所示。Employee類引用了Address類三、任務(wù)實(shí)施1序列化實(shí)體對(duì)象并寫入文件第一步,創(chuàng)建地址類AddresspublicclassAddress

implementsSerializable

{privatestaticfinallongserialVersionUID=4983187287403615604L;…}實(shí)現(xiàn)Serializable接口非常簡(jiǎn)單,只要讓Java類實(shí)現(xiàn)Serializable接口即可,無(wú)需實(shí)現(xiàn)任何方法。一個(gè)類一旦實(shí)現(xiàn)了Serializable接口,那么該類的對(duì)象就是可序列化的。第二步,創(chuàng)建員工類EmployeepublicclassEmployeeimplementsSerializable{privatestaticfinallongserialVersionUID=3049633059823371192L;privateStringname;//表示員工的姓名

privateintage;//表示員工的年齡

privateAddressaddress;//表示員工的地址…}Employee實(shí)現(xiàn)了Serializable接口,那么該類的對(duì)象就是可序列化的。該類引用了Address地址對(duì)象,地址類也是可序列化的。第三步創(chuàng)建測(cè)試類publicclassEmployeeSerializeTest{ publicstaticvoidmain(String[]args){ //創(chuàng)建一個(gè)員工對(duì)象

//將該對(duì)象寫入到文件中,序列化該對(duì)象

}}在main方法中編寫測(cè)試代碼第四步新建員工對(duì)象//創(chuàng)建address對(duì)象Addressaddress=newAddress("中國(guó)","吉林","長(zhǎng)春");//創(chuàng)建employee對(duì)象Employeeemployee=newEmployee("張XX",30,address);第五步,將對(duì)象序列化后寫入文件Filefile=newFile("D:\\employee.dat");FileOutputStream

fos=newFileOutputStream(file);ObjectOutputStream

oos=newObjectOutputStream(fos);oos.writeObject(employee);首先指定物理文件到邏輯文件Filefile=newFile("d:\\employee23.dat");然后創(chuàng)建文件輸出流到邏輯文件FileOutputStream

fos=newFileOutputStream(file);再創(chuàng)建對(duì)象輸出流到文件輸出流ObjectOutputStream

oos=newObjectOutputStream(fos);最后通過對(duì)象輸出流完成寫操作oos.writeObject(employee);oos.flush();oos.close();fos.close();第六步,關(guān)閉流2反序列化對(duì)象從磁盤上讀出反序列化將Employee對(duì)象從磁盤上讀出并修改員工信息,然后再寫入到文件中。反序列化需要使用的類是ObjectInputStream,反序列化步驟如下:創(chuàng)建ObjectInputStream對(duì)象;使用ObjectInputStream的readObject方法取出對(duì)象。首先,創(chuàng)建反序列化測(cè)試類publicstaticvoidmain(String[]args){//建立數(shù)據(jù)文件對(duì)象 Filefile=newFile("d:\\employee23.dat"); //從文件中讀取對(duì)象,反序列化該對(duì)象

//修改該員工的相關(guān)信息

//將該員工對(duì)象再次寫入文件中,進(jìn)行序列化

//再次從文件中讀取對(duì)象,進(jìn)行反序列化

}在main方法中編寫測(cè)試步驟第一步從文件中讀取對(duì)象,反序列化該對(duì)象FileInputStream

fis=newFileInputStream(file);ObjectInputStream

ois=newObjectInputStream(fis);employee1=(Employee)ois.readObject();System.out.println("修改前員工的信息:");System.out.println(employee1);//輸出employee對(duì)象首先創(chuàng)建文件輸入流fis到邏輯文件file然后創(chuàng)建對(duì)象輸入流ois到文件輸入流fis在通過對(duì)象輸入流ois讀出字節(jié)流到Java對(duì)象,最后輸出第二步,修改員工的相關(guān)信息//修改該員工的相關(guān)信息employee1.getAddress().setState("中國(guó)");employee1.getAddress().

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論