`代码如下:``
package com.wgd.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectSerializable1 {
public static void main(String[] args) throws Exception{
ObjectOutputStream oos=new ObjectOutputStream(
new FileOutputStream(new File("e:\\test\\t.txt")));
ObjectInputStream ois=new ObjectInputStream(
new FileInputStream("e:\\test\\t.txt"));
/**
* 父类序列化之后的
*/
//GrandSon gs=new GrandSon();
//oos.writeObject(gs);
//oos.flush();
//oos.close();
//GrandSon gs1=(GrandSon)ois.readObject();//因为GrandSon的父类已经序列化,所以这里不会显示调用父类的构造函数
//System.out.println(gs1);
///**
// * 打印结果为
// * Father
// Son
// GrandSon
// com.wgd.io.GrandSon@119d7047
// */
//ois.close();
/**
* 父类没被序列化之后的
*/
GrandSon gs=new GrandSon();
oos.writeObject(gs);
oos.flush();
oos.close();
GrandSon gs1=(GrandSon)ois.readObject();//因为GrandSon的父类没被序列化,所以这里会显示调用父类的构造函数
System.out.println(gs1);
/**
* 打印结果为
Father
Son
GrandSon
Father
com.wgd.io.GrandSon@7229724f
*/
ois.close();
}
}
/*
* 如果父类被序列化,那么子类也会被序列化,在反序列时不会去调用父类构造函数
*/
//class Father implements Serializable{
//public Father(){
// System.out.println("Father");
//}
//}
//class Son extends Father{
// public Son(){
// System.out.println("Son");
// }
//}
//class GrandSon extends Son{
// public GrandSon(){
// System.out.println("GrandSon");
// }
//}
/**
*父类如果没有实现序列接口,而子类实现序列接口,
*那么父类对象就不会被序列化,也就不会被保存,
*而子类却可以被序列化,即保存
*Java中构造一个对象,首先得先构造父类对象,
*才会构造子类对象,所以在反序列化子类时,
*就会调用父类构造方法来作为默认的父类对象
*而子类因为已经被序列化了(已经调用过子类构造方法的状态),
*所以就不会再调用子类自己的构造方法
*/
class Father {
public Father(){
System.out.println("Father");
}
}
class Son extends Father implements Serializable{
public Son(){
System.out.println("Son");
}
}
class GrandSon extends Son{
public GrandSon(){
System.out.println("GrandSon");
}
}