資源描述:
《對(duì)象的序列化與反序列化》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、對(duì)象的序列化與反序列化主要內(nèi)容概述當(dāng)兩個(gè)進(jìn)程進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù),包括文本圖片音頻視頻等,都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送.當(dāng)兩個(gè)java進(jìn)程進(jìn)行通信時(shí),一個(gè)進(jìn)程能否把一個(gè)java對(duì)象發(fā)送給另一個(gè)進(jìn)程呢?答案是肯定的!概述如何才能做到呢1)發(fā)送方需要把這個(gè)java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)上傳送2)接收方需要把字節(jié)序列再恢復(fù)為java對(duì)象.把java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化,.把字節(jié)序列恢復(fù)為java對(duì)象的過程稱為對(duì)象的反序列化.序列化與反序列化對(duì)象序列化兩種用途把對(duì)象的字節(jié)序列永久的保存到硬盤上,通常存放在一個(gè)文
2、件中.在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列.主機(jī)1主機(jī)2文件網(wǎng)絡(luò)傳輸存儲(chǔ)到文件9.1.jdk類庫(kù)中的序列化API如何才能做到呢1)發(fā)送方需要把這個(gè)java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)上傳送2)接收方需要把字節(jié)序列再恢復(fù)為java對(duì)象.把java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化,.把字節(jié)序列恢復(fù)為java對(duì)象的過程稱為對(duì)象的反序列化.序列化與反序列化9.1jdk類庫(kù)中的序列化APIjava.io.ObjectOutputStream:代表對(duì)象輸出流它的writeObject(Objectobj)方法可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出
3、流中。Java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié),再把它們反序列化成一個(gè)對(duì)象,并將其返回。9.1jdk類庫(kù)中的序列化API哪些類可以被序列化呢?只有實(shí)現(xiàn)了Serializable或Externalizable接口的類的對(duì)象才能被序列化,否則ObjectOutputStream的writeObject(Objectobj)方法會(huì)拋出IOException。實(shí)現(xiàn)了Serializable或Externalizable接口的類也稱為可序列化類。Externalizable接口繼承Seria
4、lizable接口,實(shí)現(xiàn)Externalizable接口的類完全由自身來控制序列化的行為。而僅實(shí)現(xiàn)Serializable接口的類可以采用默認(rèn)的序列化方式。Jdk的部分類如StringDate等都實(shí)現(xiàn)了Serializable接口9.1jdk類庫(kù)中的序列化API假定一個(gè)Customer類,它的對(duì)象需要序列化。可以有以下三種方式進(jìn)行如果customer類僅僅實(shí)現(xiàn)了Serializable接口的類,那么會(huì)按照以下方式進(jìn)行序列化和反序列化:ObjectOutputStream采用默認(rèn)的序列化方式,對(duì)Customer對(duì)象的非transient的實(shí)例變量進(jìn)行序列化。Ob
5、jectInputStream采用默認(rèn)的反序列化方式,對(duì)customer對(duì)象的非transient的實(shí)例變量進(jìn)行反序列化。9.1jdk類庫(kù)中的序列化API2.如果customer類僅僅實(shí)現(xiàn)了Serializable接口,并且還定義了readObject(ObjectInputStreamin)和writeObject(ObjectOutputStreamout),那么會(huì)按照以下方式進(jìn)行序列化和反序列化:ObjectOutputStream會(huì)調(diào)用Customer對(duì)象的writeObject(ObjectOutputStreamout)方法進(jìn)行序列化。ObjectI
6、nputStream會(huì)調(diào)用Customer對(duì)象的readObject(ObjectInputStreamin)方法進(jìn)行反序列化。9.1jdk類庫(kù)中的序列化API3.如果customer類實(shí)現(xiàn)了Externalizable接口,那么Customer類必須實(shí)現(xiàn)readExternal(ObjectInputin)和writeExternal(ObjectOutputout)方法,那么會(huì)按照以下方式進(jìn)行序列化和反序列化:ObjectOutputStream會(huì)調(diào)用Customer對(duì)象的writeExternal(ObjectOutputout)方法進(jìn)行序列化。Objec
7、tInputStream會(huì)調(diào)用Customer對(duì)象的readExternal(ObjectInputin)方法進(jìn)行反序列化。9.1jdk類庫(kù)中的序列化API類框圖9.1jdk類庫(kù)中的序列化步驟創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流:ObjectOutputStreamout=newObjectOutputStream(newfileOutputStream(“D:\objectfile.obj”));9.1jdk類庫(kù)中的序列化步驟通過對(duì)象輸出流的writeObject()方法寫對(duì)象,如:Out.writeObject(“hello
8、”);Out.write