成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java序列化和克隆

開(kāi)發(fā) 后端
本篇文章主要對(duì)Java序列化來(lái)講解,Java 序列化技術(shù)可以使你將一個(gè)對(duì)象的狀態(tài)寫(xiě)入一個(gè)Byte 流里,并且可以從其它地方把該Byte 流里的數(shù)據(jù)讀出來(lái),重新構(gòu)造一個(gè)相同的對(duì)象。

序列化

Java 序列化技術(shù)可以使你將一個(gè)對(duì)象的狀態(tài)寫(xiě)入一個(gè)Byte 流里,并且可以從其它地方把該Byte 流里的數(shù)據(jù)讀出來(lái),重新構(gòu)造一個(gè)相同的對(duì)象。

當(dāng)兩個(gè)進(jìn)程在進(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ì)象。

把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。

把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程稱為對(duì)象的反序列化。

1、序列化的用途

利用對(duì)象的序列化可以保存應(yīng)用程序的當(dāng)前工作狀態(tài),下次再啟動(dòng)的時(shí)候?qū)⒆詣?dòng)地恢復(fù)到上次執(zhí)行的狀態(tài)。

對(duì)象的序列化主要有兩種用途:

(a) 把對(duì)象的字節(jié)序列***地保存到硬盤(pán)上,通常存放在一個(gè)文件中;

(b) 在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。

2、序列化的實(shí)現(xiàn)

(1)JDK類庫(kù)中的序列化API

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

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

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

(2)對(duì)象序列化與反序列化的過(guò)程

將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒(méi)有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè) ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫(xiě)出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。

對(duì)象序列化包括如下步驟:

(a)創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流;

(b)通過(guò)對(duì)象輸出流的writeObject()方法寫(xiě)對(duì)象。

對(duì)象反序列化的步驟如下:

(a)創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類型的源輸入流,如文件輸入流;

(b)通過(guò)對(duì)象輸入流的readObject()方法讀取對(duì)象。

下面讓我們來(lái)看一個(gè)對(duì)應(yīng)的例子,類的內(nèi)容如下:

Java代碼

  1. import java.io.*;     
  2. import java.util.Date;     
  3. public class ObjectSaver {     
  4.           public static void main(String[] args) throws Exception {     
  5.               ObjectOutputStream out = new ObjectOutputStream     
  6.                      (new FileOutputStream("D:""objectFile.obj"));     
  7.               //序列化對(duì)象     
  8.               Customer customer = new Customer("阿蜜果"24);     
  9.               out.writeObject("你好!");     
  10.               out.writeObject(new Date());     
  11.               out.writeObject(customer);     
  12.               out.writeInt(123); //寫(xiě)入基本類型數(shù)據(jù)     
  13.               out.close();     
  14.               //反序列化對(duì)象     
  15.               ObjectInputStream in = new ObjectInputStream     
  16.                      (new FileInputStream("D:""objectFile.obj"));     
  17.               System.out.println("obj1=" + (String) in.readObject());     
  18.               System.out.println("obj2=" + (Date) in.readObject());     
  19.               Customer obj3 = (Customer) in.readObject();     
  20.               System.out.println("obj3=" + obj3);     
  21.               int obj4 = in.readInt();     
  22.               System.out.println("obj4=" + obj4);     
  23.               in.close();     
  24.        }     
  25. }     
  26. class Customer implements Serializable {     
  27.        private String name;     
  28.        private int age;     
  29.        public Customer(String name, int age) {     
  30.               this.name = name;     
  31.               this.age = age;     
  32.        }     
  33.        public String toString() {     
  34.               return "name=" + name + ", age=" + age;     
  35.        }     
  36. }     
  37. import java.io.*;   
  38. import java.util.Date;   
  39. public class ObjectSaver {   
  40. public static void main(String[] args) throws Exception {   
  41. ObjectOutputStream out = new ObjectOutputStream   
  42. (new FileOutputStream("D:""objectFile.obj"));   
  43. //序列化對(duì)象   
  44. Customer customer = new Customer("阿蜜果"24);   
  45. out.writeObject("你好!");   
  46. out.writeObject(new Date());   
  47. out.writeObject(customer);   
  48. out.writeInt(123); //寫(xiě)入基本類型數(shù)據(jù)   
  49. out.close();   
  50. //反序列化對(duì)象   
  51. ObjectInputStream in = new ObjectInputStream   
  52. (new FileInputStream("D:""objectFile.obj"));   
  53. System.out.println("obj1=" + (String) in.readObject());   
  54. System.out.println("obj2=" + (Date) in.readObject());   
  55. Customer obj3 = (Customer) in.readObject();   
  56. System.out.println("obj3=" + obj3);   
  57. int obj4 = in.readInt();   
  58. System.out.println("obj4=" + obj4);   
  59. in.close();   
  60. }   
  61. }   
  62. class Customer implements Serializable {   
  63. private String name;   
  64. private int age;   
  65. public Customer(String name, int age) {   
  66. this.name = name;   
  67. this.age = age;   
  68. }   
  69. public String toString() {   
  70. return "name=" + name + ", age=" + age;   
  71. }   
  72. }   

輸出結(jié)果如下:

Java代碼

 

  1. obj1=你好!     
  2. obj2=Sat Sep 26 22:02:21 CST 2010     
  3. obj3=name=阿蜜果, age=24     
  4. obj4=123     
  5. obj1=你好!   
  6. obj2=Sat Sep 26 22:02:21 CST 2010   
  7. obj3=name=阿蜜果, age=24   
  8. obj4=123   

因此例比較簡(jiǎn)單,在此不再詳述。

3、serialVersionUID作用:

序列化時(shí)為了保持版本的兼容性,即在版本升級(jí)時(shí)反序列化仍保持對(duì)象的***性。

有兩種生成方式:

一個(gè)是默認(rèn)的1L,比如:

Java代碼

 

  1. private static final long serialVersionUID = 1L;     
  2. private static final long serialVersionUID = 1L;   

 

一個(gè)是根據(jù)類名、接口名、成員方法及屬性等來(lái)生成一個(gè)64位的哈希字段,比如:

Java代碼

 

  1. private static final   long      serialVersionUID = xxxxL;    
  2. private static final   long      serialVersionUID = xxxxL;   

 

二、克隆

有時(shí)想得到對(duì)象的一個(gè)復(fù)制品,該復(fù)制品的實(shí)體是原對(duì)象實(shí)體的克隆。復(fù)制品實(shí)體的變化不會(huì)引起原對(duì)象實(shí)體發(fā)生變化,這樣的復(fù)制品稱為原對(duì)象實(shí)體的克隆對(duì)象或簡(jiǎn)稱克隆。

1、淺復(fù)制(淺克隆)

概念:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。

方法:類implements Cloneable,然后重寫(xiě)clone()方法,在clone()方法中調(diào)用super.clone()即可,沒(méi)有其他操作了

2、深復(fù)制(深克隆)

概念:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍

方法:

(1)類implements Cloneable,然后重寫(xiě)clone()方法,在clone()方法中調(diào)用super.clone(),然后還要對(duì)引用型變量所指的對(duì)象進(jìn)行克隆。

(2)序列化:將該對(duì)象寫(xiě)出到對(duì)象輸出流,那么用對(duì)象輸入流讀回的對(duì)象就是原對(duì)象的一個(gè)深度克隆

【編輯推薦】

  1. Java序列化的機(jī)制和原理
  2. Java Socket通信的序列化和反序列化代碼介紹
  3. Java輸入數(shù)據(jù)流詳解
  4. Java語(yǔ)言深入 文件和流
  5. Java對(duì)象序列化
責(zé)任編輯:金賀 來(lái)源: JavaEye博客
相關(guān)推薦

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2011-05-18 15:20:13

XML

2009-08-24 17:14:08

C#序列化

2011-06-01 15:05:02

序列化反序列化

2009-08-06 11:16:25

C#序列化和反序列化

2010-03-19 15:54:21

Java Socket

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2018-03-19 10:20:23

Java序列化反序列化

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化

2009-08-28 10:18:48

Java序列化

2021-11-18 07:39:41

Json 序列化Vue

2011-06-01 14:26:11

序列化

2013-03-11 13:55:03

JavaJSON

2023-12-26 07:26:07

Java序列化反序列化機(jī)制

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产亚洲一区二区在线观看 | 999热精品| 亚洲欧洲视频 | 天堂在线中文 | 希岛爱理在线 | 韩国av一区二区 | 亚洲成人精品免费 | 中文字幕在线观看视频一区 | 亚洲精品视频在线观看视频 | 日韩中文一区二区三区 | 久久精品一区二区视频 | 99久久久无码国产精品 | 一级做a毛片 | 四虎影院免费在线 | 国产成人一区二区三区 | 国产九九av | 怡红院成人在线视频 | 人人性人人性碰国产 | 五月激情六月婷婷 | 91视频一区二区三区 | 亚洲午夜电影 | 久久久久国产精品 | 久久成人一区 | 国产精品免费一区二区三区四区 | 亚洲欧美日韩精品久久亚洲区 | 国产视频欧美 | 成人不卡视频 | 亚洲综合色丁香婷婷六月图片 | 亚洲精品视频在线观看视频 | 大陆一级毛片免费视频观看 | 精品成人在线 | 中文字幕av在线一二三区 | 日韩av在线中文字幕 | 欧美中文字幕一区二区三区亚洲 | 精品二区视频 | 久久精品一级 | 欧美在线视频一区 | 中文字幕国产高清 | av毛片 | 视频一区二区三区四区五区 | 91精品午夜窝窝看片 |