2012-12-19 72 views
0

從標題看,它應該是同樣的老問題,但相信我,這是不同的。爲Java類生成SerialVersionUID

我正在使用EJB3,如果必須遠程調用它,我必須使所有數據對象都實現Serializable接口。

問題是,我的大多數數據對象是生成(使用速度模板),編譯和打包一次。現在我在每個類中硬編碼默認serialVersionUID,如下所示:

private static final long serialVersionUID = 1L; 

但我想知道是否有什麼辦法可以做到以下;

private static final long serialVersionUID = getSerialUID(); 
private static long getSerialUID() { 
    // Serial Version Algo code here 
} 

此外,使用默認的serialVersionUID是否有任何問題?我真的需要使用Algo生成一個唯一的ID嗎?

回答

1
  1. 使用默認的serialVersionUID有什麼問題嗎?

    使用默認值serialVersionUID沒有問題,除非您擁有超過 同一類的一個版本。

    閱讀: What is a serialVersionUID and why should I use it?

  2. 我真的需要生成使用算法中唯一的ID?

    答案會再次否。您不必使用任何Algo生成唯一的ID。如果您有不同版本的同一類的,那麼你可以提供一個唯一的編號爲的serialVersionUID(如的serialVersionUID = 123的serialVersionUID = 456)

我強烈建議你去通過的Javadoc java.io.Serializable

+0

感謝您的信息,我通過了文檔,它是有道理的。但有一件事是肯定的......即。我需要serialVersionUID,它不應該是默認的,即1L。現在問題是我應該使用標準的UUID來獲得一個(因爲即使類結構是相同的,每次我生成我的類時,這會給我一個新的數字),還是應該使用HashCode方法來檢索一個?有沒有任何如何使用HashCode的例子? – SJunejo

1

第一個答案是很有幫助,但它並沒有告訴你如何生成class serialVersionUID。我做了如下所示,因爲我的所有類都是由Velocity Template生成的,所以我必須在代碼生成時獲取它。所以我創建了一個方法來獲取所有屬性的hashcode(),並在最後添加它們以獲取serialVersionUID。例如;

public int getSerialVerionUID() { 
    return getName().hashCode() + 
     getTypeName().hashCode() + 
     getCardinality().hashCode() + 
     getComplexity().hashCode(); 
} 

因此,只要有任何屬性發生變化,我們將擁有不同的UID,這就是我們所需要的。

希望這對一些人有幫助。

+4

序列號不是一個散列,因此不應該像一個計算。它不應該依賴_values_對象,但它是_members_。 –