为什么以及如何在Java web应用程序中使用序列化?

为什么以及如何在Java web应用程序中使用序列化?,java,web-applications,Java,Web Applications,我一直在开发一个JavaWeb应用程序,其中框架坚持所有内容都是可序列化的。我假设这不是特定于框架的,而是Java中的web应用程序,我的问题是:框架/服务器/任何正在序列化的东西是什么?它必须这样做吗 注意:我对web应用程序或序列化了解不多。典型的问题是,在复制或服务器关闭期间,内部HTTP会话被“序列化”到一个持久存储,以便可以恢复或共享它们 序列化是保存对象的状态,并能够在以后重新构建该状态。序列化在任何应用程序环境中都很有用,而不仅仅是在web应用程序中 序列化的一个主要用途是传输。您

我一直在开发一个JavaWeb应用程序,其中框架坚持所有内容都是可序列化的。我假设这不是特定于框架的,而是Java中的web应用程序,我的问题是:框架/服务器/任何正在序列化的东西是什么?它必须这样做吗


注意:我对web应用程序或序列化了解不多。

典型的问题是,在复制或服务器关闭期间,内部HTTP会话被“序列化”到一个持久存储,以便可以恢复或共享它们


序列化是保存对象的状态,并能够在以后重新构建该状态。

序列化在任何应用程序环境中都很有用,而不仅仅是在web应用程序中

序列化的一个主要用途是传输。您希望将对象复制或移动到远程计算机,例如UserProfile。您可以序列化UserProfile,发送序列化数据(通常是XML)并将其反序列化到接收端的新对象,此时可以像处理原始对象一样对其进行操作


另一个用途是保存状态。您可能有一个游戏,并且希望保存游戏板的确切状态。您可以序列化Board对象,随后会告诉它序列化每个磁贴。

根据web框架的不同,会话中的对象可能会通过使用序列化来持久化到磁盘。

对于大多数应用来说,这不是严格必需的,但可以通过两种方式提高性能:

  • 用户会话可以在请求之间序列化到磁盘。当来自同一用户的请求之间的时间比处理请求所需的时间长得多时,这可以大大减少服务器的内存使用,并使您能够为更多的用户提供服务
  • 如果使用负载平衡将请求分散到多个服务器上,则需要确保同一用户的所有请求始终由同一台计算机提供服务(这降低了负载平衡器的灵活性),或者需要能够通过序列化在服务器之间移动会话数据

如果您使用的是企业级Java Bean(EJB),并且有一个无状态会话Bean API,那么每个SSB实例在一个Java虚拟机上的一个线程中运行,其客户端在不同的线程中运行,并且通常在不同计算机上的不同JVM中运行。由于无法将对Java对象的引用从一个JVM传递到另一个JVM,因此需要将该对象序列化为字符串,发送到另一个JVM,然后反序列化回一个对象。这种序列化/反序列化发生在传入的参数和传出的返回值上

如果您使用的是Java消息服务,那么您在每条消息中发送的对象将被序列化为字符串,保存到数据库中,然后由消息接收方在其他时间和地点进行反序列化


而且,正如Will Hartung指出的那样,HTTP会话对象通常是跨JVM共享的。如果您有一个运行电子商务应用程序的Glassfish Java EE应用程序服务器集群,那么每个客户的请求都会与任何可用的服务器进行负载平衡,并且该服务器必须能够查找客户的会话状态(客户名、购物车等)。它只能通过序列化来实现这一点。为了安全起见,会话状态也可以写入磁盘(例如数据库)。

由于servlet会话可以保存任何类型的对象,因此它们应该实现serializableRelated条目: