一、什么是序列化和反序列化
(1 Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
(2 ** 序列化 :**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
(3 ** 反序列化**客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。
二、子父类之间的序列化和反序列化
当一个可序列化子类有多个父类(直接和间接)的时候,这些父类必须都满足以下条件之一,该子类才能被反序列化
1、拥有无参数构造器
2、也可序列化
因为反序列化子类的时候,程序根据字节流中保存的对象的信息,对父类也进行初始化
当父类不能序列化的时候,在反序列化时,程序会去调用父类的无参构造器去初始化父类的变量(所以父类不能序列化的时候必须有无参构造器),该父类中的定义的实例变量不会序列化到流中。
public class ObjectIODemo2 {
public static void main(String[] args) {
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object")) ) {
Son1 son1 = new Son1("Father");
/*
序列化子类Son1的对象
反序列化子类
*/
oos.writeObject(son1);
Son1 s = (Son1)ois.readObject();
s.getAll();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Father {
String name = null;
private int age = 40;
//父类定义一个含参构造器
public Father(String name){
this.name = name;
System.out.println("父类有参构造器");
}
//父类定义一个无参构造器
public Father() {
System.out.println("父类无参构造器");
}
}
class Son1 extends Father implements Serializable {
String name = "Son1";
private int age = 30;
public Son1(String name) {
super(name);
}
public void getAll() {
System.out.println(super.name);
}
}
当父类能序列化的时候,在反序列化时,程序会直接序列化父类,也不会去调用构造器,不存在上述情况
public class ObjectIODemo2 {
public static void main(String[] args) {
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object")) ) {
Son1 son1 = new Son1("Father");
/*
序列化子类Son1的对象
反序列化子类
*/
oos.writeObject(son1);
Son1 s = (Son1)ois.readObject();
s.getAll();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Father implements Serializable {
String name = null;
private int age = 40;
//父类定义一个含参构造器
public Father(String name){
this.name = name;
System.out.println("父类有参构造器");
}
//父类定义一个无参构造器
public Father() {
System.out.println("父类无参构造器");
}
}
class Son1 extends Father implements Serializable {
String name = "Son1";
private int age = 30;
public Son1(String name) {
super(name);
}
public void getAll() {
System.out.println(super.name);
}
}