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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中的Serialization

發(fā)布時(shí)間:2025/3/20 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的Serialization 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來(lái)源?http://www.cnblogs.com/vicenteforever/articles/1471775.html

對(duì)象的串行化(Serialization)

?

一、串行化的概念和目的?

1.什么是串行化?

????????????對(duì)象的壽命通常隨著生成該對(duì)象的程序的終止而終止。有時(shí)候,可能需要將對(duì)象的狀態(tài)保存下來(lái),在需要時(shí)再將對(duì)象恢復(fù)。我們把對(duì)象的這種能記錄自己的狀態(tài)以便將來(lái)再生的能力。叫作對(duì)象的持續(xù)性(persistence)。對(duì)象通過(guò)寫出描述自己狀態(tài)的數(shù)值來(lái)記錄自己 ,這個(gè)過(guò)程叫對(duì)象的串行化(Serialization) 。串行化的主要任務(wù)是寫出對(duì)象實(shí)例變量的數(shù)值。如果交量是另一對(duì)象的引用,則引用的對(duì)象也要串行化。這個(gè)過(guò)程是遞歸的,串行化可能要涉及一個(gè)復(fù)雜樹結(jié)構(gòu)的單行化,包括原有對(duì)象、對(duì)象的對(duì)象、對(duì)象的對(duì)象的對(duì)象等等。對(duì)象所有權(quán)的層次結(jié)構(gòu)稱為圖表(graph)。?

2.串行化的目的?

????????????Java對(duì)象的單行化的目標(biāo)是為Java的運(yùn)行環(huán)境提供一組特性,如下所示:?

1)?????? 盡量保持對(duì)象串行化的簡(jiǎn)單扼要 ,但要提供一種途徑使其可根據(jù)開發(fā)者的要求進(jìn)行擴(kuò)展或定制。?

2)?????? 串行化機(jī)制應(yīng)嚴(yán)格遵守Java的對(duì)象模型 。對(duì)象的串行化狀態(tài)中應(yīng)該存有所有的關(guān)于種類的安全特性的信息。?

3)?????? 對(duì)象的串行化機(jī)制應(yīng)支持Java的對(duì)象持續(xù)性。?

4)?????? 對(duì)象的串行化機(jī)制應(yīng)有足夠的 可擴(kuò)展能力以支持對(duì)象的遠(yuǎn)程方法調(diào)用(RMI)。?

5)?????? 對(duì)象串行化應(yīng)允許對(duì)象定義自身 的格式即其自身的數(shù)據(jù)流表示形式,可外部化接口來(lái)完成這項(xiàng)功能。

?

?

?

二、串行化方法?
????????????從JDK1.1開始,Java語(yǔ)言提供了對(duì)象串行化機(jī)制 ,在java.io包中,接口Serialization用來(lái)作為實(shí)現(xiàn)對(duì)象串行化的工具 ,只有實(shí)現(xiàn)了Serialization的類的對(duì)象才可以被串行化。?

????????????Serializable接口中沒(méi)有任何的方法。當(dāng)一個(gè)類聲明要實(shí)現(xiàn)Serializable接口時(shí),只是表明該類參加串行化協(xié)議,而不需要實(shí)現(xiàn)任何特殊的方法。下面我們通過(guò)實(shí)例介紹如何對(duì)對(duì)象進(jìn)行串行化。?

1.定義一個(gè)可串行化對(duì)象?

????????????一個(gè)類,如果要使其對(duì)象可以被串行化,必須實(shí)現(xiàn)Serializable接口。我們定義一個(gè)類Student如下:

  • import?java.io.Serializable;???
  • ??
  • public?class?Student?implements?Serializable?{???
  • ??
  • ????int?id;//?學(xué)號(hào)???
  • ??
  • ????String?name;//?姓名???
  • ??
  • ????int?age;//?年齡???
  • ??
  • ????String?department;?//?系別???
  • ??
  • ????public?Student(int?id,?String?name,?int?age,?String?department)?{???
  • ??
  • ????????this.id?=?id;???
  • ??
  • ????????this.name?=?name;???
  • ??
  • ????????this.age?=?age;???
  • ??
  • ????????this.department?=?department;???
  • ??
  • ????}???
  • ??
  • }??
  • 2.構(gòu)造對(duì)象的輸入/輸出流?

    ????????????要串行化一個(gè)對(duì)象,必須與一定的對(duì)象輸出/輸入流聯(lián)系起來(lái),通過(guò)對(duì)象輸出流將對(duì)象狀態(tài)保存下來(lái),再通過(guò)對(duì)象輸入流將對(duì)象狀態(tài)恢復(fù)。?

    ????????????java.io包中,提供了ObjectInputStream和ObjectOutputStream將數(shù)據(jù)流功能擴(kuò)展至可讀寫對(duì)象 。在ObjectInputStream 中用readObject()方法可以直接讀取一個(gè)對(duì)象,ObjectOutputStream中用writeObject()方法可以直接將對(duì)象保存到輸出流中。

  • import?java.io.FileInputStream;???
  • import?java.io.FileOutputStream;???
  • import?java.io.IOException;???
  • import?java.io.ObjectInputStream;???
  • import?java.io.ObjectOutputStream;???
  • ??
  • public?class?ObjectSer?{???
  • ??
  • ????public?static?void?main(String?args[])?throws?IOException,???
  • ????????????ClassNotFoundException?{???
  • ??
  • ????????Student?stu?=?new?Student(981036,?"LiuMing",?18,?"CSD");???
  • ??
  • ????????FileOutputStream?fo?=?new?FileOutputStream("data.ser");???
  • ??
  • ????????ObjectOutputStream?so?=?new?ObjectOutputStream(fo);???
  • ??
  • ????????try?{???
  • ??
  • ????????????so.writeObject(stu);???
  • ??
  • ????????????so.close();???
  • ??
  • ????????}?catch?(IOException?e)?{???
  • ????????????System.out.println(e);???
  • ????????}???
  • ??
  • ????????stu?=?null;???
  • ??
  • ????????FileInputStream?fi?=?new?FileInputStream("data.ser");???
  • ??
  • ????????ObjectInputStream?si?=?new?ObjectInputStream(fi);???
  • ??
  • ????????try?{???
  • ??
  • ????????????stu?=?(Student)?si.readObject();???
  • ??
  • ????????????si.close();???
  • ??
  • ????????}?catch?(IOException?e)???
  • ??
  • ????????{???
  • ????????????System.out.println(e);???
  • ????????}???
  • ??
  • ????????System.out.println("Student?Info:");???
  • ??
  • ????????System.out.println("ID:"?+?stu.id);???
  • ??
  • ????????System.out.println("Name:"?+?stu.name);???
  • ??
  • ????????System.out.println("Age:"?+?stu.age);???
  • ??
  • ????????System.out.println("Dep:"?+?stu.department);???
  • ??
  • ????}???
  • ??
  • }??
  • 運(yùn)行結(jié)果如下:

    ????????Student Info:?

      ID:981036?

      Name:LiuMing?

      Age:18?

      Dep:CSD

    ?

    ?

    ????????????在這個(gè)例子中,我們首先定義了一個(gè)類Student,實(shí)現(xiàn)了Serializable接口 ,然后通過(guò)對(duì)象輸出流的writeObject()方法將Student對(duì)象保存到文件 data.ser中 。之后,通過(guò)對(duì)家輸入流的readObjcet()方法從文件data.ser中讀出保存下來(lái)的Student對(duì)象 。從運(yùn)行結(jié)果可以看到,通過(guò)串行化機(jī)制,可以正確地保存和恢復(fù)對(duì)象的狀態(tài)。?

    三、串行化的注意事項(xiàng)?
    1.串行化能保存的元素?

    ????????????串行化只能保存對(duì)象的非靜態(tài)成員交量,不能保存任何的成員方法和靜態(tài)的成員變量,而且串行化保存的只是變量的值,對(duì)于變量的任何修飾符都不能保存。?

    2.transient關(guān)鍵字?

    ????????????對(duì)于某些類型的對(duì)象,其狀態(tài)是瞬時(shí)的,這樣的對(duì)象是無(wú)法保存其狀態(tài)的。例如一個(gè)Thread對(duì)象或一個(gè)FileInputStream對(duì)象 ,對(duì)于這些字段,我們必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報(bào)措。?

    ????????????另外 ,串行化可能涉及將對(duì)象存放到 磁盤上或在網(wǎng)絡(luò)上發(fā)達(dá)數(shù)據(jù),這時(shí)候就會(huì)產(chǎn)生安全問(wèn)題。因?yàn)閿?shù)據(jù)位于Java運(yùn)行環(huán)境之外,不在Java安全機(jī)制的控制之中。對(duì)于這些需要保密的字段,不應(yīng)保存在永久介質(zhì)中 ,或者不應(yīng)簡(jiǎn)單地不加處理地保存下來(lái) ,為了保證安全性。應(yīng)該在這些字段前加上transient關(guān)鍵字。

    下面是java規(guī)范中對(duì)transient關(guān)鍵字的解釋: ??
    ? ? ? The ? transient ? marker ? is ? not ? fully ? specified ? by ? The ? Java ? Language ? ? Specification ? but ? is ? used ? in ? object ? serialization ? to ? mark ? member ? variables ? that ? should ? not ? be ? serialized.

    ?

    ?以下是transient的一個(gè)應(yīng)用舉例:

    轉(zhuǎn)載于:https://www.cnblogs.com/renrenbinbin/archive/2012/12/25/2833013.html

    總結(jié)

    以上是生活随笔為你收集整理的Java中的Serialization的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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