对象反序列化时,如果父类未实现序列化接口,则反序列出的对象会再次调用父类的构造函数来完成属于父类那部分内容的初始化。
1、当将一个父类没有实现序列化的对象son使用ObjectOutputStream流写到本地文件中时,没有能将该对象中属于父类的部分写入到文件,因为ObjectOutputStream流不能将一个没有实现序列化的类的对象写入文件中。当将本地文件中保存的son对象通过ObjectInputStream流反序列化到程序中,由于缺少属于父类的部分信息,则需要再次调用父类的构造器来完成初始化。
代码:Father类未实现序列化时
public static void main(String[] args) throws Exception{
Son son=new Son();
File f=new File("C:\\Users\\Administrator\\Desktop\\RoadObject.txt");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));
oos.writeObject(son);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(f));
Son son1=(Son) ois.readObject();
ois.close();
System.out.println(son1);
}
class Father {
public Father(){
System.out.println("I am Father!!");
}
}
class Son extends Father implements Serializable{
public Son(){
super();
System.out.println("I am Son!");
}
@Override
public String toString() {
return "小明";
}
}
运行的结果:
I am Father!!
I am Son!
I am Father!!
小明
2、当父类和子类都实现序列化,反序列化时则不需要再次调用父类的构造函数
代码:
public static void main(String[] args) throws Exception{
Son son=new Son();
File f=new File("C:\\Users\\Administrator\\Desktop\\RoadObject.txt");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));
oos.writeObject(son);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(f));
Son son1=(Son) ois.readObject();
ois.close();
System.out.println(son1);
}
class Father implements Serializable{
public Father(){
System.out.println("I am Father!!");
}
}
class Son extends Father implements Serializable{
public Son(){
super();
System.out.println("I am Son!");
}
@Override
public String toString() {
return "小明";
}
}
运行的结果:
I am Father!!
I am Son!
小明
探讨了在Java中对象序列化与反序列化过程中,父类是否实现了序列化接口对于对象状态的影响。若父类未实现序列化,子类在反序列化时会重新调用父类构造函数;而当父类也实现序列化时,则不会发生此类现象。
9803

被折叠的 条评论
为什么被折叠?



