大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談Java序列化接口

淺談Java序列化接口

更新時間:2020-10-29 17:39:49 來源:動力節(jié)點 瀏覽1015次

 

Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現(xiàn),因此這些方法可以在不同的地方被不同的類實現(xiàn),而這些實現(xiàn)可以具有不同的行為(功能)。而序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。Java序列化接口顧名思義,簡單地說,就是可以將一個對象(標(biāo)志對象的類型)及其狀態(tài)轉(zhuǎn)換為字節(jié)碼,保存起來(可以保存在數(shù)據(jù)庫,內(nèi)存,文件等),然后可以在適當(dāng)?shù)臅r候再將其狀態(tài)恢復(fù)(也就是反序列化)。


1 .Serializable接口

(1)serialization 不但可以在本機做,而且可以經(jīng)由網(wǎng)絡(luò)操作。它自動屏蔽了操作系統(tǒng)的差異,字節(jié)順序等。比如,在 Windows 平臺生成一個對象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺 Unix 機器上,然后可以在這臺Unix機器上正確地重構(gòu)(deserialization)這個對象。 不必關(guān)心數(shù)據(jù)在不同機器上如何表示,也不必關(guān)心字節(jié)的順序或者其他任何細(xì)節(jié)。

另外,還應(yīng)明白以下幾點:

a. java.io.Serializable接口沒有任何方法屬性域,實現(xiàn)它的類只是從語義上表明自己是可以序列化的。

b. 在對一個 Serializable(可序列化)對象進行重新裝配的過程中,不會調(diào)用任何構(gòu)建器(甚至默認(rèn)構(gòu)建器)。整個對象都是通過從 InputStream 中取得數(shù)據(jù)恢復(fù)的。

c. 如是要一個類是可序列化的,那么它的子類也是可序列化的。

(2)serialVersionUID

serialVersionUID的取值是Java運行時環(huán)境根據(jù)類的內(nèi)部細(xì)節(jié)自動生成的。如果對類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會發(fā)生變化。

類的serialVersionUID的默認(rèn)值完全依賴于Java編譯器的實現(xiàn),對于同一個類,用不同的Java編譯器編譯,有可能會導(dǎo)致不同的serialVersionUID,也有可能相同。為了提高哦啊serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。顯式地定義serialVersionUID有兩種用途:

a. 在某些場合,希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;

b. 在某些場合,不希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。


2.自定義序列化

自定義序列化是由ObjectInput/OutputStream在序列化/反序列化時候通過反射檢查該類是否存在以下方法(0個或多個):執(zhí)行順序從上往下,序列化調(diào)用1和2,反序列調(diào)用3和4;transient關(guān)鍵字當(dāng)某個字段被聲明為transient后,默認(rèn)序列化機制就會忽略該字段。

1Object writeReplace() throws ObjectStreamException;可以通過此方法修改序列化的對象

2void writeObject(java.io.ObjectOutputStream out) throws IOException; 方法中調(diào)用defaultWriteObject() 使用writeObject的默認(rèn)的序列化方式,除此之外可以加上一些其他的操作,如添加額外的序列化對象到輸出:out.writeObject("XX")

3void readObject(java.io.ObjectInputStream in) throws Exception; 方法中調(diào)用defaultReadObject()使用readObject默認(rèn)的反序列化方式,除此之外可以加上一些其他的操作,如讀入額外的序列化對象到輸入:in.readObject()

4Object readResolve() throws ObjectStreamException;可以通過此方法修改返回的對象

例子:單例模式的類實現(xiàn)序列化接口,若使用默認(rèn)的序列化策略,則在反序列化返回的對象不符合單利模式(反射創(chuàng)建了新的對象,如下PersonSington對象),可以通過修改序列化的readResolve來實現(xiàn)自定義序列化返回結(jié)果來實現(xiàn)單例對象唯一(相當(dāng)于1,2,3方法對4的結(jié)果毫無作用)。

public class PersonSingleton implements Serializable {

private static final long serialVersionUID = 1L;

private String name;

private PersonSingleton(String name) {

this.name = name;

};

private static PersonSingleton person = null;

public static synchronized PersonSingleton getInstance() {

if (person == null)

return person = new PersonSingleton("cgl");

return person;

}

private Object writeReplace() throws ObjectStreamException {

System.out.println("1 write replace start");

return this;//可修改為其他對象

}

private void writeObject(java.io.ObjectOutputStream out) throws IOException {

System.out.println("2 write object start");

out.defaultWriteObject();

//out.writeInt(1);

}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {

System.out.println("3 read object start");

in.defaultReadObject();

//int i=in.readInt();

}

private Object readResolve() throws ObjectStreamException {

System.out.println("4 read resolve start");

return PersonSingleton.getInstance();//不管序列化的操作是什么,返回的都是本地的單例對象

}

public static void main(String[] args) throws Exception {

FileOutputStream out = new FileOutputStream(new File("D://person.dat"));

ObjectOutputStream op = new ObjectOutputStream(out);

op.writeObject(PersonSingleton.getInstance());

op.close();

FileInputStream in = new FileInputStream(new File("D://person.dat"));

ObjectInputStream oi = new ObjectInputStream(in);

Object person = oi.readObject();

in = new FileInputStream(new File("D://person.dat"));

oi = new ObjectInputStream(in);

PersonSinglton person1 = (PersonSinglton) oi.readObject();

System.out.println("sington person hashcode:" + person.hashCode());

System.out.println("sington person1 hashcode:" + person1.hashCode());

System.out.println("singleton getInstance hashcode:" + PersonSingleton.getInstance().hashCode());

System.out.println("singleton person equals:" + (person == PersonSingleton.getInstance()));

System.out.println("person equals1:" + (person1 == person));

}

}

運行結(jié)果:

write replace start

write object start

read object start

read resolve start

read object start

read resolve start

sington person hashcode:1550089733

sington person1 hashcode:1550089733

sington getInstance hashcode:1550089733

sington person equals:true

person equals1:true


3 Externalizable接口

Externalizable繼承于Serializable,當(dāng)使用該接口時,序列化的細(xì)節(jié)需要由程序員去完成。若writeExternal()與readExternal()方法未作任何處理,那么該序列化行為將不會保存/讀取任何一個字段。出結(jié)果中所有字段的值均為空。

另外,若使用Externalizable進行序列化,當(dāng)讀取對象時,會調(diào)用被序列化類的無參構(gòu)造器去創(chuàng)建一個新的對象,然后再將被保存對象的字段的值分別填充到新對象中。由于這個原因,實現(xiàn)Externalizable接口的類必須要提供一個無參的構(gòu)造器,且它的訪問權(quán)限為public。


以上就是為大家嘔心瀝血的整理的關(guān)于Java序列化接口的相關(guān)知識,相對于其他的Java接口知識點,Java序列化接口需要更多的時間去理解。觀看本站的Java接口教程,結(jié)合其他的Java知識,貫徹其中,才能徹底掌握J(rèn)ava序列化接口。


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 免费黄视频网站 | 2019精品国产品免费观看 | 波多野结衣中文字幕一区二区三区 | 四虎免费在线观看视频 | 黑人巨大精品战中国美女 | 日韩一区二区三区在线观看 | 精品久久久久久国产免费了 | 欧美成综合网网站 | 九九精品视频一区在线 | 免费特黄级夫费生活片 | 色a4yy| 成人午夜 | 日本一片免费观看高清完整 | 亚洲视频手机在线 | 亚洲国产欧美在线观看 | 欧美精品a毛片免费观看 | 久久久久久天天夜夜天天 | 波多野结衣一区 | 114毛片免费观看网站 | 97久久曰曰久久久 | 九九99香蕉在线视频免费 | 最近中文2019视频在线 | 黄色国产视频 | 四虎网站在线播放 | 国产做人爱三级视频在线 | av天天看| 欧美成人毛片免费网站 | 中文字幕在线观看一区二区三区 | 亚洲码和乱人伦中文一区 | 日本久久久久亚洲中字幕 | 天天干天天操天天插 | 日韩a在线播放 | 久久国产热这里只有精品8 久久国产三级 | 日韩毛片免费线上观看 | 开心久久婷婷综合中文字幕 | 国产一级影片 | 伊人色综合久久天天网 | 久久国产精品视频一区 | 精品久久国产 | 亚洲日本免费 | 成人欧美视频在线观看播放 |