子类之间的序列化

时间:2013-04-02 10:38:27

标签: java serialization

在采访中,我们要求有一个A类没有实现serializable界面,如下所示

class A
{ 
    private int a;

    A( int a)
    {
        this.a = a;
    }
}

并且有一个类B,它扩展了A并实现了serializable接口

class B extends A implements serializable
{

    private int a , b;

    B(int a, int b)
    {
        this.a = a;
        this.b = b; 
    }
}

现在请告知我是否可以序列化B类,前提是类A未序列化,假设我要序列化类B的对象,是否可以完成。

6 个答案:

答案 0 :(得分:4)

  

现在请告知我是否可以序列化B类,前提是A类未序列化

任何实现Serializable的类都可以序列化。即使它的基类没有实现它。

所有类都扩展Object,这不是可序列化的,但它的子类可以通过实现Serializable来序列化。

答案 1 :(得分:4)

无法在不修改A的情况下序列化B以获得可访问的无参数构造函数。

来自java.io.Serializable

的javadoc
  

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

     

在反序列化期间,非序列化类的字段将是   使用公共或受保护的无参数构造函数初始化   类。必须可以访问子类的无参数构造函数   序列化的。

答案 2 :(得分:1)

是的,你可以,因为你的类正在实现可序列化的接口,这足以使你的B类序列化。

答案 3 :(得分:1)

是;无论A类如何,都可以序列化B类。

修改

class A{
int a;
A(int t){
    a =t;
}
A(){}   //default constructor is must
 }

class B extends A implements Serializable{
String b;
B(int t, String u){
    super(t);
    b=u;
}
}

public class SOSerialization {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("test.ser"));
    B b = new B(1, "tmp");
    os.writeObject(b);
    os.close();

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"));

    Object o = ois.readObject();
    ois.close();
    B bb = (B)o;
    System.out.println(" values :"+ bb.a + "  "+ bb.b);
}
}

因此,如果要成功进行反序列化,则需要提供默认构造函数。

输出:

值:0 tmp

因此它获得了超类属性的默认值。

答案 4 :(得分:0)

当然..在这里我们只能序列化B类..但不是A因为它没有实现Serialization接口。

虽然序列化没问题。但是,虽然反序列化只会导致运行时错误。

答案 5 :(得分:0)

当然,您可以在实现Serializable接口时序列化B类。

1 - 实现Serializable接口的任何类都可以序列化。

基类是否可以序列化无关紧要。

2 - 如果基类是Serializable,那么子类也是Serializable。

3 - 如果对象被序列化,那么它的序列化将完成对象图。 实例变量引用的所有对象,由对象序列化开始。