我怀疑是使用场景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
}
答案 0 :(得分:2)
这应该是Serialilzable
。 扩展MessageBean
时,MessageBean
的所有扩展类都默认继承Serializable
抽象类的MessageBean
接口。
我建议在每个扩展(子)类中分配唯一的serialVersionUID
。
编辑:从Searialization的角度来看,scenario1
和sceanrio2
并没有什么不同但理论上它们是不同的,因为您在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,绝对应该有效。