在采访中,我们要求有一个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
的对象,是否可以完成。
答案 0 :(得分:4)
现在请告知我是否可以序列化B类,前提是A类未序列化
是
任何实现Serializable
的类都可以序列化。即使它的基类没有实现它。
所有类都扩展Object
,这不是可序列化的,但它的子类可以通过实现Serializable
来序列化。
答案 1 :(得分:4)
无法在不修改A的情况下序列化B以获得可访问的无参数构造函数。
的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 - 如果对象被序列化,那么它的序列化将完成对象图。 实例变量引用的所有对象,由对象序列化开始。