首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有超类和子类的序列化

带有超类和子类的序列化
EN

Stack Overflow用户
提问于 2012-11-16 05:10:44
回答 3查看 3.9K关注 0票数 0

我怀疑是否可以使用场景1来实现序列化。如果我扩展了一个抽象类,它可以通过许多子类进行序列化,这是否有可能实现呢?就像我尝试使用场景2一样。

可序列化将适用于所有豆子或不适用,请帮助我。

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

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

设想1:

代码语言:javascript
复制
public class EmailMaster implements Serializable 
{
// setters and getters
}

设想2:

代码语言:javascript
复制
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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-16 05:13:27

试一试

代码语言:javascript
复制
Serializable emailMaster = new EmailMaster();

如果它有效,那么EmailMaster 就是-a Serializable。AFAIK,这绝对是可行的。

票数 1
EN

Stack Overflow用户

发布于 2012-11-16 05:15:34

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

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

scenario1编辑:从搜索的角度来看, sceanrio2 并不是不同的,但是理论上它们是不同的,因为在sceario2中有一个额外的抽象类,它可以有更多的方法/属性,这也将对EmailMaster类可用。

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-16 05:15:59

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

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

因此,这两种场景都可以工作,但是无论如何,一个具体的可序列化类必须有一个无args构造函数。请参阅下面的Serializable Javadoc

实现java.io.Serializable接口的类启用了类的可序列化性。不实现此接口的类将没有任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,只用于标识可序列化的语义。 为了允许非序列化类的子类型被序列化,子类型可能承担保存和恢复超级类型的公共、保护和(如果是可访问的)包字段的状态的责任。只有当它扩展的类有一个可访问的no构造函数来初始化类的状态时,子类型才能承担这一责任。如果不是这样的话,声明类可序列化是一个错误。该错误将在运行时检测到。

此外,关于对象的Serial Version ID

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

代码语言:javascript
复制
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;  

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13410840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档