Java序列化问题

时间:2010-10-27 04:51:07

标签: java serialization

当我序列化抽象类时,继承子类也会序列化吗? 这是否包括抽象类及其子类的成员?

public abstract class RootClass implements Serializable{
 Object data;
}

public class SubClassA extends RootClass{
 Object dataA;
}

public class SubClassB extends RootClass{
 Object dataB;
}

现在,当我实例化SubClassA和SubClassB类时,我会序列化这些实例吗?

它是否包含子类和根类的成员?

3 个答案:

答案 0 :(得分:8)

不确定我是否理解这个问题。无论如何,我会试着回答。

当你声明一个抽象类Serializable时,这个接口也被子类继承,所以它们被认为是Serializable,并且也必须是可序列化的(如果你什么也不做,将会应用默认的序列化机制,这可能是或者可能不起作用。)

您只序列化对象实例,而不是类。

默认序列化也会序列化父类的字段,但前提是该父类也是Serializable。如果不是,则父状态不是序列化的。

如果序列化抽象类'子类的对象,并且抽象类是Serializable,那么该抽象父类中的所有字段也将被序列化(通常的例外适用,例如瞬态或静态字段)。

答案 1 :(得分:0)

序列化用于“对象”并保存其状态而不是类。由于您无法为抽象类创建实例,因此讨论它们是否可以首先序列化是没有意义的。

答案 2 :(得分:0)

当您实例化某个类的对象时,其数据由两部分组成:由其类定义的字段和由超类定义的字段。请注意,并非所有继承的字段都可访问,只有那些定义为protectedpublic(或在同一个包中未经修改)。

如果对象的类是Serializable,则其字段将被序列化(除非标记为transient),对于继承的字段也是如此。在您的情况下,SubClassA的实例将包含'data'和'dataA',并且因为类和子类都是Serializable,所以这两个字段都将被序列化。反序列化后,两个字段都应该可以访问。