六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學(xué)習(xí)啦 > 知識(shí)大全 > 知識(shí)百科 > 百科知識(shí) > java中序列化是什么

java中序列化是什么

時(shí)間: 歐東艷656 分享

java中序列化是什么

  簡單來說序列化就是一 種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化,流的概念這里不用多說(就是I/O),我們可以對流化后的對象進(jìn)行讀寫操作,也可將流化 后的對象傳輸于網(wǎng)絡(luò)之間(注:要想將對象傳輸于網(wǎng)絡(luò)必須進(jìn)行流化)!在對對象流進(jìn)行讀寫操作時(shí)會(huì)引發(fā)一些問題,而序列化機(jī)制正是用來解決這些問題的!

  如 上所述,讀寫對象會(huì)有什么問題呢?比如:我要將對象寫入一個(gè)磁盤文件而后再將其讀出來會(huì)有什么問題嗎?別急,其中一個(gè)最大的問題就是對象引用!舉個(gè)例子來 說:假如我有兩個(gè)類,分別是A和B,B類中含有一個(gè)指向A類對象的引用,現(xiàn)在我們對兩個(gè)類進(jìn)行實(shí)例化{ A a = new A(); B b = new B(); },這時(shí)在內(nèi)存中實(shí)際上分配了兩個(gè)空間,一個(gè)存儲(chǔ)對象a,一個(gè)存儲(chǔ)對象b,接下來我們想將它們寫入到磁盤的一個(gè)文件中去,就在寫入文件時(shí)出現(xiàn)了問題!因?yàn)?對象b包含對對象a的引用,所以系統(tǒng)會(huì)自動(dòng)的將a的數(shù)據(jù)復(fù)制一份到b中,這樣的話當(dāng)我們從文件中恢復(fù)對象時(shí)(也就是重新加載到內(nèi)存中)時(shí),內(nèi)存分配了三個(gè) 空間,而對象a同時(shí)在內(nèi)存中存在兩份,想一想后果吧,如果我想修改對象a的數(shù)據(jù)的話,那不是還要搜索它的每一份拷貝來達(dá)到對象數(shù)據(jù)的一致性,這不是我們所 希望的!

  以下序列化機(jī)制的解決方案:

  1.保存到磁盤的所有對象都獲得一個(gè)序列號(hào)(1, 2, 3等等)

  2.當(dāng)要保存一個(gè)對象時(shí),先檢查該對象是否被保存了。

  3.如果以前保存過,只需寫入"與已經(jīng)保存的具有序列號(hào)x的對象相同"的標(biāo)記,否則,保存該對象

  通過以上的步驟序列化機(jī)制解決了對象引用的問題!

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

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

  修改默認(rèn)的序列化機(jī)制

  在序列化的過程中,有些數(shù)據(jù)字段我們不想將其序列化,對于此類字段我們只需要在定義時(shí)給它加上transient關(guān)鍵字即可,對于 transient字段序列化機(jī)制會(huì)跳過不會(huì)將其寫入文件,當(dāng)然也不可被恢復(fù)。但有時(shí)我們想將某一字段序列化,但它在SDK中的定義卻是不可序列化的類 型,這樣的話我們也必須把他標(biāo)注為transient,可是不能寫入又怎么恢復(fù)呢?好在序列化機(jī)制為包含這種特殊問題的類提供了如下的方法定義:

  private void readObject(ObjectInputStream in) throws

  IOException, ClassNotFoundException;

  private void writeObject(ObjectOutputStream out) throws

  IOException;

  (注:這些方法定義時(shí)必須是私有的,因?yàn)椴恍枰泔@示調(diào)用,序列化機(jī)制會(huì)自動(dòng)調(diào)用的)

  使用以上方法我們可以手動(dòng)對那些你又想序列化又不可以被序列化的數(shù)據(jù)字段進(jìn)行寫出和讀入操作。

246214