5

在面试中被问到有一个类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,可以做到吗。

4

6 回答 6

4

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

是的。

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

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

于 2013-04-02T10:42:43.083 回答
4

如果不将 A 修改为具有可访问的无参数构造函数,则无法序列化 B。

来自java.io.Serializable的 javadoc

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

在反序列化过程中,不可序列化类的字段将使用类的公共或受保护的无参数构造函数进行初始化。可序列化的子类必须可以访问无参数构造函数。

于 2013-04-02T10:43:55.860 回答
1

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

于 2013-04-02T10:43:14.153 回答
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

所以它获取超类属性的默认值。

于 2013-04-02T10:44:35.890 回答
0

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

虽然序列化没问题。但是,只有反序列化时才会出现运行时错误。

于 2013-04-02T10:43:04.277 回答
0

当然你可以序列化 B 类,因为它实现了 Serializable 接口。

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

基类是否可序列化并不重要。

2 - 如果基类是可序列化的,那么子类也是可序列化的。

3 - 如果一个对象被序列化,那么它完整的对象图将被序列化。实例变量引用的所有对象,由序列化的对象盯着。

于 2013-04-02T10:54:49.060 回答