javaBean為什么要implements Serializable


 一個對象序列化的接口,一個類只有實現了Serializable接口,它的對象才是可序列化的。因此如果要序列化某些類的對象,這些類就必須實現Serializable接口。而實際上,Serializable是一個空接口,沒有什么具體內容,它的目的只是簡單的標識一個類的對象可以被序列化。

 

        什么情況下需要序列化:

        1.     當你想把的內存中的對象寫入到硬盤的時候。

        2.     當你想用套接字在網絡上傳送對象的時候。

        3.     當你想通過RMI傳輸對象的時候。

 再稍微解釋一下:

        1.    比如說你的內存不夠用了,那計算機就要將內存里面的一部分對象暫時的保存到硬盤中,等到要用的時候再讀入到內存中,硬盤的那部分存儲空間就是所謂的虛擬內存。在比如過你要將某個特定的對象保存到文件中,我隔幾天在把它拿出來用,那么這時候就要實現Serializable接口。

 

        2.    在進行Java的Socket編程的時候,你有時候可能要傳輸某一類的對象,那么也就要實現Serializable接口。最常見的你傳輸一個字符串,它是JDK里面的類,也實現了Serializable接口,這樣做為的是將數據變為二進制來傳輸,所以可以在網絡上傳輸。

 

        3.    如果要通過遠程的方法調用(RMI)去調用一個遠程對象的方法,如在計算機A中調用另一台計算機B的對象的方法,那么你需要通過JNDI服務獲取計算機B目標對象的引用,將對象從B傳送到A,就需要實現序列化接口。

 

二、 關於serialVersionUID 

  序列化運行時使用一個稱為 serialVersionUID 的版本號與每個可序列化類相關聯,該序列號在反序列化過程中用於驗證序列化對象的發送者和接收者是否為該對象加載了與序列化兼容的類。如果接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本號不同,則反序列化將會導致InvalidClassException。可序列化類可以通過聲明名為 "serialVersionUID" 的字段(該字段必須是靜態 (static)、最終 (final) 的 long 型字段)顯式聲明其自己的 serialVersionUID:ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

 
   如果可序列化類未顯式聲明 serialVersionUID,則序列化運行時將基於該類的各個方面計算該類的默認 serialVersionUID 值,如“Java(TM) 對象序列化規范”中所述。不過,強烈建議所有可序列化類都顯式聲明 serialVersionUID 值,原因是計算默認的 serialVersionUID 對類的詳細信息具有較高的敏感性,根據編譯器實現的不同可能千差萬別,這樣在反序列化過程中可能會導致意外的 InvalidClassException。因此,為保證 serialVersionUID 值跨不同 java 編譯器實現的一致性,序列化類必須聲明一個明確的 serialVersionUID 值。還強烈建議使用 private 修飾符顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應用於直接聲明類 -- serialVersionUID 字段作為繼承成員沒有用處。數組類不能聲明一個明確的 serialVersionUID,因此它們總是具有默認的計算值,但是數組類沒有匹配 serialVersionUID 值的要求。
 
package com.pwrd.net.request.bean;  
  
import java.io.Serializable;  
  
public class LoginDataRequestBean implements Serializable {  
  
    /** 
     * 生成的serialVersionUID 
     */  
    private static final long serialVersionUID = 5231134212346077681L;  
  
    private String uname;  
    private String upwd;  
    private String extrData;  
  
    public String getUname() {  
        return uname;  
    }  
  
    public void setUname(String uname) {  
        this.uname = uname;  
    }  
  
    public String getUpwd() {  
        return upwd;  
    }  
  
    public void setUpwd(String upwd) {  
        this.upwd = upwd;  
    }  
  
    public String getExtrData() {  
        return extrData;  
    }  
  
    public void setExtrData(String extrData) {  
        this.extrData = extrData;  
    }  
  
}  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM