备忘录模式(Memento)
所谓的备忘录,顾名思义,可以用来备份的东西,比如游戏的存档,数据库的快照等等,就是对某一项内容进行数据备份,在必要时可以通过这个备份进行数据的恢复或者回退,将数据恢复或者回退到备份前的状态
简单来说,以前有些游戏,需要到存盘点才可以存盘,这时候你没有存盘,跑去打BOSS,结果又没打赢,死了。这时候读取的存档,就是一份备忘录
- Java的序列化接口
要实现java的默认序列化与反序列化,则必须实现Serializable接口,建议添加serialVersionUID,且生成后不要修改
1. 实现序列化与反序列化
- 实现序列化接口
/**
* @author Xiaoyingge
* @description
* @date 2020/5/18 23:55
*/
public class Person implements Serializable {
private static final long serialVersionUID = -1121922134355937096L;
private String name;
private int age;
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
public int getAge () {
return age;
}
public void setAge (int age) {
this.age = age;
}
}
- 测试写入文件中再反序列化读取
/**
* @author Xiaoyingge
* @description
* @date 2020/5/18 23:57
*/
public class Main {
private static final String FILE_PATH = "d:/test.ini";
public static void main (String[] args) throws Exception {
Person person = new Person();
person.setName("小萤哥");
person.setAge(18);
serial(person);
Person person2 = readFromFile();
System.out.println(person2.getName() + person2.getAge());
}
private static void serial (Person person) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH));
oos.writeObject(person);
oos.close();
}
private static Person readFromFile () throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH));
return (Person) ois.readObject();
}
}
- 运行结果,读取文件中的字符成功
2.再测试下生成文件后,修改serialVersionUID
- 先修改serialVersionUID,将第二位改成9
/**
* @author Xiaoyingge
* @description
* @date 2020/5/18 23:55
*/
public class Person implements Serializable {
private static final long serialVersionUID = -1921922134355937096L;
private String name;
private int age;
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
public int getAge () {
return age;
}
public void setAge (int age) {
this.age = age;
}
}
- 直接执行读取逻辑
- 抛出如下异常:
Exception in thread "main" java.io.InvalidClassException: com.xiaoyingge.memento.Person; local class incompatible: stream classdesc serialVersionUID = -1121922134355937096, local class serialVersionUID = -1921922134355937096
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at com.xiaoyingge.memento.Main.readFromFile(Main.java:36)
at com.xiaoyingge.memento.Main.main(Main.java:23)
因此千万不要在已经生成serialVersionUID之后 ,再去修改它哦