2012-11-16 43 views
0

我的疑惑是使用方案1可以實現序列化。如果我擴展一個可以被許多子類序列化的抽象類,那麼這是否可以實現?正如我在方案2中嘗試的那樣。使用超級類和子類進行序列化

可序列化將適用於所有豆類,請幫助我。

我懷疑情景1和情景2會相同或不同。

//方法來發送消息::: sendMsgs(SerializableObject)

方案1:

public class EmailMaster implements Serializable 
{ 
// setters and getters 
} 

方案2:

public abstract class MessageBean implements Serializable 
{ 
} 

//whether EmailMaster and EmailEvent will become serializable ? 

public class EmailMaster extends MessageBean 
{ 
// setters and getters 



public class EmailEvent extends MessageBean 
{ 
// setters and getters 
} 
+1

退房的第二個評論 http://stackoverflow.com/questions/8257380/should-i-consider-serialization-issues-when-designing-abstract-classes –

+0

你爲什麼不嘗試一下? –

回答

1

嘗試

Serializable emailMaster = new EmailMaster(); 

如果有效,那麼EmailMasteris-aSerializable。 AFAIK,這絕對應該工作。

+0

我的懷疑情景1和情景2會相同或不同。 – sunleo

+0

我不確定你的意思。但是,它們與第一個沒有'MessageBean'的區別不同,而另一個則沒有。 –

+0

我有方法sendMsgs(MessageBean MB)只接受可序列化的對象,所以我使用第二場景。所以這是正確的或不?請幫幫我。 – sunleo

2

這應該是Serialilzable當您擴展MessageBean時,所有擴展類MessageBean默認繼承接口從MessageBean抽象類。

我會建議在每個擴展(子)類中分配獨特的serialVersionUID

編輯:從Searialization角度來看,scenario1sceanrio2沒有什麼兩樣但理論上是你有在sceario2額外的抽象類,它可以有更多的方法,它們是不同的/屬性,這也將獲取可供EmailMaster類。

在這兩種情況下:sendMsgs(SerializableObject)應該工作。基於兩者之間的抽象類的需要在sceanrio1和scenario2之間作出決定。 如果您不需要抽象類用於任何其他目的,請使用scenario1。

2

Serializable由抽象類用作任何其他接口下的所有子類繼承:

如果A實現Serializable,無論此類擴展將是Serializable

所以這兩種情況下會起作用,但在任何情況下,一個具體的Serializable類必須有一個無參數構造函數。請參閱以下Serializable Javadoc

類的串行化是通過實現 java.io.Serializable接口的類啓用。沒有實現這個接口的類將沒有任何狀態序列化或反序列化。 可序列化類的所有子類本身都是可序列化的。 序列化接口沒有方法或字段,並且僅用於識別可序列化的語義 。

要允許不可序列化類的子類型進行系列化, 亞型可以承擔保存和恢復超類型的公共狀態 ,保護的責任,以及(如果可訪問)包 領域。 只有當它擴展的類 具有可訪問的無參數構造函數來初始化 類的狀態時,該子類型纔可以承擔此責任。如果這個 不是這種情況,那麼聲明一個類Serializable是錯誤的。該錯誤將在運行時檢測到。

此外,關於所述對象的Serial Version ID

序列化運行時相關聯,每個序列化類一個 版本號,稱爲的serialVersionUID,該期間 反序列化用於驗證發送方和一個序列化的對象的接收器已經加載了該對象的類,這些類與 相關的序列化兼容。如果接收方已加載 對象的類,該對象的serialVersionUID與 對應的發送者類不同,則反序列化將導致InvalidClassException。可序列化類可以通過聲明名爲 「的serialVersionUID」字段必須是靜態的,最終明確地聲明自己的 的serialVersionUID,並鍵入長:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

如果一個序列化的類不明確聲明的serialVersionUID,則序列化運行時將計算基於各個方面的類的 ,作爲Java(TM)對象序列 規格描述該類的 默認的serialVersionUID值。然而,強烈建議所有 序列化的類顯式聲明的serialVersionUID值,因爲 默認serialVersionUID的計算是類 細節,可能會因編譯器實現變化高度敏感,並能 期間 反序列化從而導致意外InvalidClassExceptions。

+0

感謝您的幫助。 – sunleo