日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

I/O流(三)—对象的序列化和反序列化

發(fā)布時(shí)間:2024/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I/O流(三)—对象的序列化和反序列化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、序列化和反序列化的概念  
把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。
   把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。
  
  對(duì)象的序列化主要有兩種用途:
  1) 把對(duì)象的字節(jié)序列永久地保存到硬盤上,通常存放在一個(gè)文件中;
  2) 在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。
  
  在很多應(yīng)用中,需要對(duì)某些對(duì)象進(jìn)行序列化,讓它們離開(kāi)內(nèi)存空間,入住物理硬盤,以便長(zhǎng)期保存。比如最常見(jiàn)的是Web服務(wù)器中的Session對(duì)象,當(dāng)有 10萬(wàn)用戶并發(fā)訪問(wèn),就有可能出現(xiàn)10萬(wàn)個(gè)Session對(duì)象,內(nèi)存可能吃不消,于是Web容器就會(huì)把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對(duì)象還原到內(nèi)存中。

二、JDK類庫(kù)中的序列化API 
 
1、java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中。

2、java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)對(duì)象,并將其返回。

3、只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對(duì)象才能被序列化。Externalizable接口繼承自Serializable接口,實(shí)現(xiàn)Externalizable接口的類完全由自身來(lái)控制序列化的行為,而僅實(shí)現(xiàn)Serializable接口的類可以 采用默認(rèn)的序列化方式 。

4、對(duì)象序列化包括如下步驟:
  1) 創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流;
  2) 通過(guò)對(duì)象輸出流的writeObject()方法寫對(duì)象。

5、對(duì)象反序列化的步驟如下:
  1) 創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類型的源輸入流,如文件輸入流;
  2) 通過(guò)對(duì)象輸入流的readObject()方法讀取對(duì)象。
 
6、對(duì)象序列化和反序列范例:

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.Map; /*** * @author lmb*將map鍵值對(duì)序列化輸出到磁盤上,再讀入,然后再將其以鍵值對(duì)的形式打印到控制臺(tái)*/ public class ObjectOutput {public static void main(String[] args) throws Exception{//構(gòu)造MAP對(duì)象Map m=new HashMap();m.put("cat", "貓");m.put("dog", "狗");m.put("pig", "豬");m.put("sheep", "羊");//構(gòu)造輸出流(序列化)ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("F:/私人物品劉夢(mèng)冰/學(xué)習(xí)資料/exercise/object.obj"));oos.writeObject(m);//將對(duì)象序列化輸出oos.flush();oos.close();//構(gòu)造輸入流(反序列化)ObjectInputStream ois=new ObjectInputStream(new FileInputStream("F:/私人物品劉夢(mèng)冰/學(xué)習(xí)資料/exercise/object.obj"));for (;;) {Object object=ois.readObject();if (object==null) break;System.out.println(object);}ois.close();} }

運(yùn)行結(jié)果:


三、serialVersionUID的作用

  s?e?r?i?a?l?V?e?r?s?i?o?n?U?I?D?:? ?字?面?意?思?上?是?序?列?化?的?版?本?號(hào)?,凡是實(shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量。
  

四、serialVersionUID的取值

  serialVersionUID的取值是Java運(yùn)行時(shí)環(huán)境根據(jù)類的內(nèi)部細(xì)節(jié)自動(dòng)生成的。如果對(duì)類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會(huì)發(fā)生變化。
  類的serialVersionUID的默認(rèn)值完全依賴于Java編譯器的實(shí)現(xiàn),對(duì)于同一個(gè)類,用不同的Java編譯器編譯,有可能會(huì)導(dǎo)致不同的 serialVersionUID,也有可能相同。為了提高serialVersionUID的獨(dú)立性和確定性,強(qiáng)烈建議在一個(gè)可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。

  顯式地定義serialVersionUID有兩種用途:
    1、 在某些場(chǎng)合,希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;
    2、 在某些場(chǎng)合,不希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。

總結(jié)

以上是生活随笔為你收集整理的I/O流(三)—对象的序列化和反序列化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。