序列化Java进程,然后反序列化它——最好是以非侵入性的方式

序列化Java进程,然后反序列化它——最好是以非侵入性的方式,java,serialization,aspectj,Java,Serialization,Aspectj,我需要序列化一个Java进程(到持久性存储,如磁盘),然后终止它 然后在以后的时间将其反序列化,并在以后的日期重新恢复 限制条件: 我已经有了一套我想添加此功能的流程 因此,我正在寻找一种微创的解决方案 这些进程的代码将重新建立到资源(如套接字、数据库等)的连接 我需要做的是持久化线程状态、变量、对象等 注: 我对对象图的序列化问题有相当的了解 很多年前,我已经在概念上想出了如何使用AspectJ实现这一点,但我找不到我的笔记 这个问题只涉及Java进程——因此解决方案可以在OSX、Linux或

我需要序列化一个Java进程(到持久性存储,如磁盘),然后终止它

然后在以后的时间将其反序列化,并在以后的日期重新恢复

限制条件:

  • 我已经有了一套我想添加此功能的流程
  • 因此,我正在寻找一种微创的解决方案
  • 这些进程的代码将重新建立到资源(如套接字、数据库等)的连接
  • 我需要做的是持久化线程状态、变量、对象等
  • 注:

  • 我对对象图的序列化问题有相当的了解
  • 很多年前,我已经在概念上想出了如何使用AspectJ实现这一点,但我找不到我的笔记
  • 这个问题只涉及Java进程——因此解决方案可以在OSX、Linux或Windows上运行的JVM上运行
  • 讨论中的过程将是重构,以实现此功能

  • 您不能以通用的方式单独使用Java来实现这一点。您可以在虚拟机中运行JVM,该虚拟机可以根据需要停止、保存在磁盘上并重新启动。注意,必须重新建立网络连接。没有办法以透明恢复的方式保存它们,因为另一端会看到套接字已经消失。

    类,如
    线程
    套接字
    和其他
    java.io
    类并没有实现可序列化。话虽如此,作为重构提示,我可以向您推荐的最好方法是让您的应用程序在触发时提供一种干净的保存和恢复状态的方法。由于您无法重新创建线程或网络连接的状态,因此,根据问题域的不同,您可能能够以事务安全的方式编写类,并且您可以在关机时记录正在运行的事务,并确保在唤醒/反序列化后重新调度/重新启动这些事务

    (免责声明:即使在你编辑了你的问题之后,它也是如此的不具体,以至于我只能在下面给出一个有根据的猜测和一般性的提示。)

    首先也是最重要的是,您在这里处理的是一个设计问题。在您解决了设计问题之后,AOP可能有助于实现此关注点(它显然是交叉的)。例如,您可以让一个方面向相关类添加一个接口,如
    Interruptable
    ,并将其连接到实现所需行为的功能,例如
    ObjectState interrupt()
    void continue(ObjectState)
    (所有类、接口和方法名称都是纯粹的发明)。因此,虽然您无法以您所描述的相当神奇的方式冻结应用程序,但通过一些艰苦的工作,您可能能够保存应用程序状态,至少可以帮助您以恢复逻辑状态的方式重新启动它(而不是像套接字连接、线程ID这样的技术状态)因此,应用程序可以在冻结之前继续执行它所做的任何操作

    例如,下载管理器可以继续下载文件,因为它以前已记录其逻辑状态:下载源、临时文件名和已写入的字节数。因此,即使需要建立新的网络连接才能继续下载,“事务”也不需要从头开始重新启动。我想这就是你想要的

    写下这段独白,在我看来,我所描述的部分功能可能存在于现有的应用程序服务器或容器中(我不是这方面的专家)


    因此,当您最终找到了一种方法让所有相关的应用程序类保持其逻辑状态时,请回来问另一个问题,关于如何使用AspectJ或其他工具最好地完成您想要的任务。:-)

    对我来说,这听起来不像是Java特有的问题。您需要一种可以为任何类型的进程(Java或其他)实现这一点的机制。比如休眠。一个任意进程,或者你可以控制进程的实现吗?这个问题涉及:1。Java进程2。一个进程谁是代码库我可以重构我将更新问题以反映这些澄清你可以序列化大部分状态,但你不能序列化线程、程序计数器等,因此进程不能从它停止的地方继续。您的AspectJ解决方案不可能完成更多的工作,即使您已经完成了它。如Marko所说,如果您真的想要进程休眠,您需要操作系统的帮助,请定义“Java进程序列化”。我有一个假设,你所说的这个术语可能是什么意思,如果我的假设是正确的,我也许可以给你一些建议。否则我的答案将毫无意义,所以请详细说明一些。嗨,我已经澄清了我的问题,应用程序必须有优雅地重新建立到资源(如网络套接字等)连接的代码。这就是我所说的。;)应用程序必须知道如何做到这一点。你不能透明地做。非常感谢你的回答。。。我认为你已经很好地概述了这些问题,我认为我有一个想法。