簡體   English   中英

超級類和子類的序列化

[英]Serialization with Super class and Sub class

我的疑問是使用方案1是否有可能實現序列化。 如果我擴展了一個抽象類,該抽象類可以通過許多子類的方式進行序列化,那有可能實現嗎? 正如我在場景2中嘗試的那樣。

可序列化是否適用於所有bean,請幫助我。

我懷疑方案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
}

這應該是Serialilzable 擴展MessageBean ,默認情況下,所有擴展的MessageBean類都是繼承自MessageBean抽象類的Serializable接口。

我建議在每個extending(sub)類中分配唯一的serialVersionUID

編輯:從Searialization角度來看, scenario1sceanrio2並沒有什么不同,但是從理論上講它們是不同的,因為您在sceario2中有一個附加的抽象類,它可以具有更多的方法/屬性,這些內容也可以用於EmailMaster類。

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

像其他任何接口一樣,可Serializable由抽象類的所有子類繼承:

如果A實現Serializable ,則擴展A的任何類都將是Serializable

因此,這兩種方案都可以使用,但無論如何,具體的Serializable類必須具有no-args構造函數 請參閱以下可序列化的Javadoc

通過實現java.io.Serializable接口的類,可以啟用類的可序列化性。 未實現此接口的類將不會對其狀態進行序列化或反序列化。 可序列化類的所有子類型本身都是可序列化的。 序列化接口沒有方法或字段,僅用於標識可序列化的語義。

為了允許不可序列化類的子類型被序列化,該子類型可以負責保存和恢復超類型的公共,受保護和(如果可訪問)程序包字段的狀態。 僅當其擴展的類具有可訪問的無參數構造函數來初始化類的狀態時,該子類型才可以承擔此責任 如果不是這樣,則聲明一個可序列化的類是錯誤的。 該錯誤將在運行時檢測到。

此外,關於對象的Serial Version ID

序列化運行時與每個可序列化的類關聯一個版本號,稱為serialVersionUID,在反序列化期間使用該版本號來驗證序列化對象的發送者和接收者是否已加載了該對象的與序列化兼容的類 如果接收方已為該對象加載了一個與相應發送方類具有不同的serialVersionUID的類,則反序列化將導致InvalidClassException。 可序列化的類可以通過聲明一個名稱為“ serialVersionUID”的字段來顯式聲明其自己的serialVersionUID,該字段必須是靜態的,最終的且類型為long:

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

如果可序列化的類未顯式聲明serial_VersionUID,則序列化運行時將根據該類的各個方面,為該類計算默認的serialVersionUID值,如Java(TM)對象序列化規范中所述 但是,強烈建議所有可序列化的類顯式聲明serialVersionUID值,因為默認的serialVersionUID計算對類詳細信息高度敏感,而類詳細信息可能會根據編譯器的實現而有所不同,因此可能在反序列化期間導致意外的InvalidClassExceptions。

嘗試

Serializable emailMaster = new EmailMaster();

如果有效,則EmailMaster 是-可 Serializable AFAIK,那絕對應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM