使用Super class和Sub类进行序列化

时间:2012-11-16 05:10:44

标签: java

我怀疑是使用场景1可以实现序列化。如果我扩展一个可由许多子类序列化的抽象类,这是否可以实现?当我尝试使用场景2时。

Serializable将适用于所有豆类,请帮助我。

我的疑问场景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
}

3 个答案:

答案 0 :(得分:2)

这应该是Serialilzable扩展MessageBean时,MessageBean的所有扩展类都默认继承Serializable抽象类的MessageBean接口。

我建议在每个扩展(子)类中分配唯一的serialVersionUID

编辑:从Searialization的角度来看,scenario1sceanrio2并没有什么不同但理论上它们是不同的,因为您在sceario2中有一个额外的抽象类,它可以有更多的方法/属性,也可以用于EmailMaster类。

在两种情况下:sendMsgs(SerializableObject)应该有效。根据两者之间抽象类的需要,在sceanrio1和scenario2之间做出决定。 如果您不需要将抽象类用于任何其他目的,请使用scenario1。

答案 1 :(得分:2)

Serializable由抽象类的所有子类继承,与任何其他接口一样:

如果A实现了Serializable,那么任何类扩展A都将是Serializable

因此两个场景都可以工作,但在任何情况下,具体的Serializable类必须具有no-args构造函数。请参阅以下Serializable Javadoc

  

类的可序列化由实现该类的类启用   java.io.Serializable接口。没有实现此功能的类   接口不会将其任何状态序列化或反序列化。   可序列化类的所有子类型本身都是可序列化的。该   序列化接口没有方法或字段,仅用于   确定可序列化的语义。

     

要允许序列化非序列化类的子类型,   子类型可能承担保存和恢复状态的责任   超类型的公共,受保护和(如果可访问)包   领域。 只有在课程中,子类型才可以承担此责任   它扩展了一个可访问的无参数构造函数来初始化   阶级的状态。如果这样,声明一个Serializable类是错误的   事实并非如此。将在运行时检测到错误。

此外,关于对象的Serial Version ID

  

序列化运行时与每个可序列化的类a关联   版本号,称为 serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人类,然后反序列化将导致   InvalidClassException。可序列化的类可以声明它自己的类   serialVersionUID通过声明一个名为的字段显式地显示   “serialVersionUID”必须是static,final和long类型:

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

如果可序列化类没有显式声明serialVersionUID,那么序列化运行时将计算一个   基于各个方面的该类的默认serialVersionUID值   该类的类,如Java(TM)对象序列化中所述   说明书即可。但是,强烈建议所有人   可序列化类显式声明serialVersionUID值,因为   默认的serialVersionUID计算对类非常敏感   细节可能因编译器实现而异,并且可以   因此导致意外的InvalidClassExceptions期间   反序列化。

答案 2 :(得分:1)

尝试

Serializable emailMaster = new EmailMaster();

如果有效,那么EmailMaster 就是 Serializable。 AFAIK,绝对应该有效。