久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java 序列化Serializable詳解(附詳細(xì)例子)

 liang1234_ 2016-05-12

Java 序列化Serializable詳解(附詳細(xì)例子)

1,、什么是序列化和反序列化
Serialization(序列化)是一種將對(duì)象以一連串的字節(jié)描述的過(guò)程;反序列化deserialization是一種將這些字節(jié)重建成一個(gè)對(duì)象的過(guò)程,。


2,、什么情況下需要序列化
a)當(dāng)你想把的內(nèi)存中的對(duì)象保存到一個(gè)文件中或者數(shù)據(jù)庫(kù)中時(shí)候;
b)當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候,;
c)當(dāng)你想通過(guò)RMI傳輸對(duì)象的時(shí)候,;

3,、如何實(shí)現(xiàn)序列化

將需要序列化的類實(shí)現(xiàn)Serializable接口就可以了,,Serializable接口中沒(méi)有任何方法,可以理解為一個(gè)標(biāo)記,,即表明這個(gè)類可以序列化,。


4,、序列化和反序列化例子

如果我們想要序列化一個(gè)對(duì)象,首先要?jiǎng)?chuàng)建某些OutputStream(如FileOutputStream,、ByteArrayOutputStream等),,然后將這些OutputStream封裝在一個(gè)ObjectOutputStream中。這時(shí)候,,只需要調(diào)用writeObject()方法就可以將對(duì)象序列化,,并將其發(fā)送給OutputStream記住:對(duì)象的序列化是基于字節(jié)的,,不能使用Reader和Writer等基于字符的層次結(jié)構(gòu),。而反序列的過(guò)程(即將一個(gè)序列還原成為一個(gè)對(duì)象),需要將一個(gè)InputStream(如FileInputstream,、ByteArrayInputStream等)封裝在ObjectInputStream內(nèi),,然后調(diào)用readObject()即可。

package com.sheepmu;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class MyTest implements Serializable{ private static final long serialVersionUID = 1L; private String name='SheepMu'; private int age=24; public static void main(String[] args) {//以下代碼實(shí)現(xiàn)序列化 try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream('my.out'));//輸出流保存的文件名為 my.out ,;ObjectOutputStream能把Object輸出成Byte流 MyTest myTest=new MyTest(); oos.writeObject(myTest); oos.flush(); //緩沖流 oos.close(); //關(guān)閉流 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } fan();//調(diào)用下面的 反序列化 代碼 } public static void fan()//反序列的過(guò)程 { ObjectInputStream oin = null;//局部變量必須要初始化 try { oin = new ObjectInputStream(new FileInputStream('my.out')); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } MyTest mts = null; try { mts = (MyTest ) oin.readObject();//由Object對(duì)象向下轉(zhuǎn)型為MyTest對(duì)象 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println('name='+mts.name); System.out.println('age='+mts.age); }}
會(huì)在此項(xiàng)目的工作空間生成一個(gè) my.out文件,。序列化后的內(nèi)容稍后補(bǔ)齊,先看反序列化后輸出如下:

name=SheepMu
age=24

5,、序列化ID

序列化 ID 在 Eclipse 下提供了兩種生成策略,,一個(gè)是固定的 1L,一個(gè)是隨機(jī)生成一個(gè)不重復(fù)的 long 類型數(shù)據(jù)(實(shí)際上是使用 JDK 工具生成),,在這里有一個(gè)建議,,如果沒(méi)有特殊需求,就是用默認(rèn)的 1L 就可以,,這樣可以確保代碼一致時(shí)反序列化成功,。這也可能是造成序列化和反序列化失敗的原因,因?yàn)椴煌男蛄谢痠d之間不能進(jìn)行序列化和反序列化,。


6.序列化前和序列化后的對(duì)象的關(guān)系

是 '=='還是equal,? or 是淺復(fù)制還是深復(fù)制?

答案:深復(fù)制,,反序列化還原后的對(duì)象地址與原來(lái)的的地址不同

序列化前后對(duì)象的地址不同了,,但是內(nèi)容是一樣的,而且對(duì)象中包含的引用也相同,。換句話說(shuō),,通過(guò)序列化操作,我們可以實(shí)現(xiàn)對(duì)任何可Serializable對(duì)象的”深度復(fù)制(deep copy)'——這意味著我們復(fù)制的是整個(gè)對(duì)象網(wǎng),而不僅僅是基本對(duì)象及其引用,。對(duì)于同一流的對(duì)象,,他們的地址是相同,說(shuō)明他們是同一個(gè)對(duì)象,但是與其他流的對(duì)象地址卻不相同,。也就說(shuō),,只要將對(duì)象序列化到單一流中,就可以恢復(fù)出與我們寫出時(shí)一樣的對(duì)象網(wǎng),,而且只要在同一流中,,對(duì)象都是同一個(gè)。


7.靜態(tài)變量能否序列化

若把上面的代碼中的 age變量前加上 static ,輸出任然是

name=SheepMu
age=24

但是看下面的例子:

package com.sheepmu;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class MyTest implements Serializable{ private static final long serialVersionUID = 1L; private String name='SheepMu'; private static int age=24; public static void main(String[] args) {//以下代碼實(shí)現(xiàn)序列化 try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream('my.out'));//輸出流保存的文件名為 my.out ,;ObjectOutputStream能把Object輸出成Byte流 MyTest myTest=new MyTest(); oos.writeObject(myTest); oos.flush(); //緩沖流 oos.close(); //關(guān)閉流 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } fan();//調(diào)用下面的 反序列化 代碼 } public static void fan() { new MyTest().name='SheepMu_1';//!!!!!!!!!!!!!!!!重點(diǎn)看這兩行 更改部分 age=1;//!!!!!!!!!!!!!!!!!!!重點(diǎn)看這兩行 更改部分 ObjectInputStream oin = null;//局部變量必須要初始化 try { oin = new ObjectInputStream(new FileInputStream('my.out')); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } MyTest mts = null; try { mts = (MyTest ) oin.readObject();//由Object對(duì)象向下轉(zhuǎn)型為MyTest對(duì)象 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println('name='+mts.name); System.out.println('age='+mts.age); }}
輸出結(jié)果為:

name=SheepMu
age=1
為何把最上面代碼的age變量添上static 后還是反序列化出了24呢,?而新的從新對(duì)變量賦值的代碼,不是static的得到了序列化本身的值,,而static的則得到的是從新附的值,。原因: 序列化會(huì)忽略靜態(tài)變量,即序列化不保存靜態(tài)變量的狀態(tài),。靜態(tài)成員屬于類級(jí)別的,,所以不能序列化。即 序列化的是對(duì)象的狀態(tài)不是類的狀態(tài),。這里的不能序列化的意思,,是序列化信息中不包含這個(gè)靜態(tài)成員域。最上面添加了static后之所以還是輸出24是因?yàn)樵?#20540;是JVM加載該類時(shí)分配的值,。注:transient后的變量也不能序列化,,但是情況稍復(fù)雜,稍后開篇說(shuō),。

8,、總結(jié):

a)當(dāng)一個(gè)父類實(shí)現(xiàn)序列化,子類自動(dòng)實(shí)現(xiàn)序列化,,不需要顯式實(shí)現(xiàn)Serializable接口,;

b)當(dāng)一個(gè)對(duì)象的實(shí)例變量引用其他對(duì)象,序列化該對(duì)象時(shí)也把引用對(duì)象進(jìn)行序列化,;

c) static,transient后的變量不能被序列化,;



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多