参考链接:Java序列化的理解与学习
https://www.cnblogs.com/yedu/p/4342021.html
以下是java序列化的自我理解(不完善):
package com.ming.abstractClass;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/*jdk中这句话的理解:
* 要允许不可序列化类的子类型序列化,
* 可以假定该子类型负责保存和恢复超类型的公用 (public)、
* 受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。
* 仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此职责。
* 如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。
* 在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数构造方法。
* 可序列化子类的字段将从该流中恢复。
*
* 解释:父类没有实现Serializable,子类实现了Serializable,序列化子类时,父类必须有空参构造,否则抛异常 java.io.InvalidClassException:
*/
public class TestSerializable {
public static void main(String[] args) throws Exception {
Sub sub = new Sub("Adm", true);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.out"));
oos.writeObject(sub);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.out"));
Sub other = (Sub)ois.readObject();
System.out.println(other);
}
}
class Super {
private String name;
/* public Super() {
System.out.println("Damn it");
}*/
public Super(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Sub extends Super implements Serializable {
private static final long serialVersionUID = 3846752112809249244L;
private boolean fuckable;
public Sub(String name, boolean fuckable) {
super(name);
this.fuckable = fuckable;
}
public void setFuckable(boolean fuckable) {
this.fuckable = fuckable;
}
public boolean getFuckable() {
return fuckable;
}
public String toString() {
return getName()+getFuckable();
}
}