Java 将会话对象存储在独立应用程序中的何处?

Java 将会话对象存储在独立应用程序中的何处?,java,session,serialization,restore,store,Java,Session,Serialization,Restore,Store,我有一个会话对象没有实现java.lang.Serializable。(这是一个遗留应用程序,现在我无法更改代码) 是否有任何方法可以将会话对象存储在某个位置,然后在独立应用程序中恢复相同的状态 一个想法是使用RMI。有没有更好的方法来实现这一点 编辑:遗留应用程序具有API,这些API为我提供会话对象。在会话对象上,我将调用这些方法。获取会话对象确实是一项昂贵的操作。因此,我希望将其存储在某个位置,以便在会话有效之前执行后续操作 谢谢:)让我们假设您可以询问会话对象以确定其状态,并且给定该状态

我有一个会话对象没有实现java.lang.Serializable。(这是一个遗留应用程序,现在我无法更改代码)

是否有任何方法可以将会话对象存储在某个位置,然后在独立应用程序中恢复相同的状态

一个想法是使用RMI。有没有更好的方法来实现这一点

编辑:遗留应用程序具有API,这些API为我提供会话对象。在会话对象上,我将调用这些方法。获取会话对象确实是一项昂贵的操作。因此,我希望将其存储在某个位置,以便在会话有效之前执行后续操作


谢谢:)

让我们假设您可以询问会话对象以确定其状态,并且给定该状态,您可以创建一个等效的新会话对象。然后您需要一个helper类,它的每个实例都与会话对象关联,并且可以序列化。您编写helper类的序列化来存储会话的状态,并且当您通过序列化创建一个新的会话时,它将创建会话。

从这个问题中,我假设您可以向应用程序的外部边缘添加代码,但是到处都有“小心JabberWock”的标志

如果它不可序列化,那么对象可能会包含对本质上不可序列化的东西的引用,比如服务、有状态bean等等。。。以及其他只有在容器中才有意义的东西。现在,通常情况下,你可能不需要容器外的大部分东西

RMI不会解决您的问题,因为这样负载必须是可序列化的,返回到第1方


一种实用的方法可能是使用一个简单的XML生成器,如Apache Commons的XML Digester(如果它仍然存在),或者使用一些简单的JSON生成器,从独立应用程序中需要的会话中提取数据,并将其转储到一个有意义的树中。

如果会话对象确实引用了不可序列化的内容(不仅仅是从接口的角度,而是从它所持有的非序列化有状态实例的类型来看),那么您将很难以有意义的方式重新构建它

如果不是这种情况,那么您可以使用序列化它,即使没有实现Serializable


幸运的是,它很容易测试:如果重建的会话对象对您有效,那么您就没有问题。

对不起,我没有得到实用的方法。会话对象有我将调用的方法。我不会只读取其中的数据。我已经编辑了问题陈述。如果不清楚,很抱歉。谢谢。现在我明白了。序列号这一点让我很扫兴。现在我理解了RMI部分。是的,这似乎是一个不错的方法:创建一个RMI facade,其中包含一个接口,用于访问会话对象中的内容/方法,会话对象仍保留在它起源的JVM中。我更喜欢无状态接口,每个用例有一个方法传递会话id,但您也可以创建RMI wrapp用于会话的单个实例,并在JNDI上下文中发布它们,以便在独立客户端上检索。如果使用EJB容器,这非常容易,因为Spring有Spring远程处理可以帮助您。我尝试使用XStream序列化。仍然没有成功。我想某些属性无法序列化。我遇到了错误:发生异常:com.thoughtworks.xstream.converters.ConversionException:无法调用java.security.CodeSource.readObject():Index:2,Size:2,当我尝试序列化对象时。@HanuAthena,你如何与会话对象交互?你甚至看不到代码?我可以!我有会话类及其依赖项的jar文件。但是会话对象中很少有属性嵌套得很深,有些属性在尝试序列化时会出现在其中HanuAthena,你说你不能更改代码,但要序列化和反序列化,你至少必须将你不想序列化的东西标记为暂时的(或者是xcode的任何标记)。所以你可以通过更改原始代码,或者通知xcode你不想序列化某些属性来实现(可能您必须为此更改原始代码)。问题是OP无法(我认为)从序列化数据重新创建会话对象。因此,您可能能够获取其核心并序列化它们,但如果它不公开允许您手动反序列化的方法。。。。?