0

我怀疑使用场景 1 是否可以实现序列化。如果我扩展一个可以通过许多子类方式序列化的抽象类,这可能实现吗?正如我尝试使用场景 2 一样。

可序列化是否适用于所有bean,请帮助我。

我怀疑场景 1 和场景 2 将相同或不同。

//发送消息的方法 ::: sendMsgs(SerializableObject)

场景一:

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

场景二:

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
}
4

3 回答 3

2

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

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

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

在这两种情况下:sendMsgs(SerializableObject)应该工作。根据中间抽象类的需要,在sceanrio1和scenario2之间做出决定。如果您不需要抽象类用于任何其他目的,请使用方案 1。

于 2012-11-16T05:15:34.397 回答
2

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

如果 A implements Serializable,则扩展 A 的任何类都将是Serializable

所以这两种场景都可以工作,但在任何情况下,一个具体的 Serializable 类都必须有一个无参数的构造函数。请参阅以下可序列化的 Javadoc

类的可序列化性由实现 java.io.Serializable 接口的类启用。未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义。

为了允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。仅当它扩展的类具有可访问的无参数构造函数来初始化类的 state 时,子类型才可以承担此责任。如果不是这种情况,则声明类 Serializable 是错误的。将在运行时检测到错误。

此外,关于Serial Version ID对象:

序列化运行时与每个可序列化类关联一个版本号,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的 serialVersionUID 与相应发送者的类不同,则反序列化将导致 InvalidClassException。可序列化的类可以通过声明一个名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、最终的和long类型:

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

如果可序列化类没有显式声明 serialVersionUID,则序列化运行时将根据类的各个方面为该类计算默认的 serialVersionUID 值,如 Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能在反序列化期间导致意外的 InvalidClassExceptions。

于 2012-11-16T05:15:59.823 回答
1

尝试

Serializable emailMaster = new EmailMaster();

如果它有效,那么EmailMaster is-a Serializable。AFAIK,这绝对应该工作。

于 2012-11-16T05:13:27.087 回答