Java设计模式全集-备忘录模式(Memento)

备忘录模式(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之后 ,再去修改它哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值