欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

使用Serializable的原因

本篇內(nèi)容主要講解“使用Serializable的原因”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“使用Serializable的原因”吧!

在布爾津等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),布爾津網(wǎng)站建設(shè)費用合理。

經(jīng)常看到有些類調(diào)用了Serializable接口,而有些類又沒有調(diào)用Serializable接口。那么什么情況下要調(diào)用Serializable接口。

首先來了解一下Serializable。(類通過實現(xiàn) java.io.Serializable 接口以啟用其序列化功能。未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。序列化接口Serializable沒有方法或字段,僅用于標(biāo)識可序列化的語義)

實現(xiàn)了Serializable接口的對象,可將它們轉(zhuǎn)換成一系列字節(jié),并可在以后完全恢復(fù)回原來的樣子。這一過程亦可通過網(wǎng)絡(luò)進行。這意味著序列化機制能自動補償操作系統(tǒng)間的差異。換句話說,可以先在Windows機器上創(chuàng)建一個對象,對其序列化,然后通過網(wǎng)絡(luò)發(fā)給一臺Unix機器,然后在那里準(zhǔn)確無誤地重新“裝配”。不必關(guān)心數(shù)據(jù)在不同機器上如何表示,也不必關(guān)心字節(jié)的順序或者其他任何細節(jié)。

serialization主要用來支持2種主要的特性:

1、RMI(Remote method invocation)。

RMI允許象在本機上一樣操作遠程機器上的對象。當(dāng)發(fā)送消息給遠程對象和調(diào)用遠程方法時,就需要用到serializaiton機制來發(fā)送參數(shù)和接收返回值。

2、保存信息。

在某個時候把狀態(tài)信息保存起來,以便以后某個時候能恢復(fù)這些狀態(tài)信息。

Hibernaet和EJB中的實體Bean就用到了上面兩個特性。

另外:保存的時候不僅能保存對象的副本,而且還會把對象里面所引用的對象也保存起來,以此類推。就像在編譯某個類一樣,會涉及到所用到的所有類。但是所引用的對象也必須是可序列化的,不然會拋NotSerializableException異常。

下面來寫個例子:(A和B類都是可序列化的,WriteObj:將A序列化,ReadObj:將A反序列化)

class A:

package woxingwosu;  import java.io.Serializable;  public class A implements Serializable{  private String name="my name is a";  private B b=null;  A(){  b=new B();  }  public B getB() {  return b;  }  public void setB(B b) {  this.b = b;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public String show(){  return "a.toString <a.name=\""+this.name+"\" a.b.name=\""+this.b.getName()+"\">" +"\na="+this.toString()+" b="+this.b.toString();  }  }

class B:

package woxingwosu;  import java.io.Serializable;  public class B implements Serializable{  private String name="my name is B";  B(){}  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  }

class WriteSeri:

package woxingwosu;  import java.io.FileOutputStream;  import java.io.ObjectOutputStream;  /**  * 寫Object(系列化)  * @author 我行我素  */ public class WriteSeri {  public static void main(String[] args) {  ObjectOutputStream outObj=null;  try{  FileOutputStream outStr=new FileOutputStream("obj.txt");  outObj=new ObjectOutputStream(outStr);  A a=new A();  outObj.writeObject(a);  System.out.println("write obj :"+a.show());  outObj.flush();  }catch(Exception e){  e.printStackTrace();  }finally{  try{  if(outObj!=null)  outObj.close();  }catch(Exception e){  e.printStackTrace();  }  }  }}

class ReadSeri:

package woxingwosu;  import java.io.FileInputStream;  import java.io.ObjectInputStream;  /**  * 讀Object(反系列化)  * @author 我行我素  */ public class ReadSeri {  public static void main(String[] args) {  ObjectInputStream inObj=null;  try{  FileInputStream inStr=new FileInputStream("obj.txt");  inObj=new ObjectInputStream(inStr);  A a=(A)inObj.readObject();  System.out.println("read Object :"+a.show());  }catch(Exception e){  e.printStackTrace();  }finally{  try{  if(inObj!=null)  inObj.close();  }catch(Exception e){  e.printStackTrace();  }  }  }  }

首先,我們運行WriteObj,實現(xiàn)序列化,得到輸出結(jié)果

write obj :a.toString <a.name="my name is a" a.b.name="my name is B">  a=woxingwosu.A@a90653 b=woxingwosu.B@de6ced

然后我們再運行ReadObj,實現(xiàn)反序列化,得到輸出結(jié)果

read Object :a.toString <a.namea.name="my name is a" a.b.name="my name is B"> a=woxingwosu.A@a90653 b=woxingwosu.B@de6ced

遺漏了一個問題,就是標(biāo)識版本的serialVersionUID。

官方文檔:如果可序列化類未顯式聲明 serialVersionUID,則序列化運行時將基于該類的各個方面計算該類的默認 serialVersionUID 值,如“Java(TM) 對象序列化規(guī)范”中所述。不過,強烈建議 所有可序列化類都顯式聲明 serialVersionUID 值,原因計算默認的 serialVersionUID 對類的詳細信息具有較高的敏感性,根據(jù)編譯器實現(xiàn)的不同可能千差萬別,這樣在反序列化過程中可能會導(dǎo)致意外的 InvalidClassException。因此,為保證 serialVersionUID 值跨不同 java 編譯器實現(xiàn)的一致性,序列化類必須聲明一個明確的 serialVersionUID 值。還強烈建議使用 private 修改器顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應(yīng)用于立即聲明類 -- serialVersionUID 字段作為繼承成員沒有用處。

剛才寫的例子中就沒有用到serialVersionUID,這時JVM會根據(jù)類名、接口名、成員方法及屬性等來生成一個64位的哈希字段作為serialVersionUID。但是如果序列化和反序列化的JVM版本不一樣的話,還是顯示寫上serialVersionUID安全。

到此,相信大家對“使用Serializable的原因”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站欄目:使用Serializable的原因
文章網(wǎng)址:http://www.chinadenli.net/article4/ishsie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)云服務(wù)器建站公司ChatGPT商城網(wǎng)站品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化