存储/恢复整个应用程序的快照/状态

Posted

技术标签:

【中文标题】存储/恢复整个应用程序的快照/状态【英文标题】:Store/Restore snapshot/state of entire application 【发布时间】:2016-12-18 15:42:16 【问题描述】:

我想存储整个应用程序状态,然后在下次启动时恢复它。有没有图书馆可以让我更轻松?或者大家有什么建议吗?

独立应用程序

【问题讨论】:

什么样的应用程序?网络版还是独立版? 独立应用程序 我会在运行时序列化驻留在我的应用程序中的所有对象 @JavaHopper: 这意味着每个对象都是可序列化的 通过带有注释的对象创建您的状态,您可以使用SimpleXML,它的工作原理与 C# 中的 XMLSerializer 非常相似。 【参考方案1】:

有一种设计模式可用于您的目的,那就是 Memento 模式。

备忘录模式由三个对象实现:发起者、看守者和备忘录。发起者是一些具有内部状态的对象。看守者将对发起者做一些事情,但希望能够撤消更改。看守人首先向发起人索要纪念品。然后它会执行它要执行的任何操作(或操作序列)。为了回滚到操作之前的状态,它将备忘录对象返回给发起者。纪念品对象本身是一个不透明的对象(看守者不能或不应该更改的对象)。 - ***

您可以阅读 wiki 页面中提供的示例以了解如何在您的代码中使用它。

如果您想将对象的状态保存为文件,并且即使在程序执行结束后仍然可用,您应该在要存储的类中实现 Serializable 接口。

例子:

public class Example implements Serializable
    

    

以及实例化该类的位置:

try

    Example c = new Example();
    FileOutputStream fout = new FileOutputStream("YOURPATH");
    ObjectOutputStream oos = new ObjectOutputStream(fout);   
    oos.writeObject(c);
    oos.close();
    System.out.println("Done");

   catch(Exception ex)
       ex.printStackTrace();
   

【讨论】:

@Eric 你可能想避免这种策略。想象一下:有人正在使用您的应用程序。 Example 对象在退出时存储到其驱动器中。有一天,您在Example 中发现了一个错误/错误(可能是您拼错了一个单词),因此您编辑Example 以修复该错误。当人们打开应用程序备份时,它会尝试从驱动器加载Example 对象,但会失败,因为修复错误实际上改变了Example 的二进制表示。序列化对象“泄漏实现”,如果实例已经存在于应用程序之外(在您的驱动器上),则阻止您修改类

以上是关于存储/恢复整个应用程序的快照/状态的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 快照和恢复

Ngxs存储快照vs selectsnapshot

快照技术分为()类?

对于虚拟机快照克隆以及xshell的优化

将整个进程状态存储在磁盘上并稍后恢复? (在 Linux/Unix 上)

什么是虚拟机的快照?