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

时间:2009-05-21 18:53:57

标签: java web-applications

我一直致力于Java Web应用程序,其中框架坚持认为一切都是可序列化的。我假设这不是特定于框架,而是特定于Java中的Web应用程序,我的问题是:什么是框架/服务器/无论做什么都是序列化的东西?是否必须这样做?

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

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:3)

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

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

另一个用途是保存状态。你可能有一个游戏,你想保存游戏板的确切状态。您可以序列化Board对象,随后可以告诉它序列化每个Tiles。

答案 3 :(得分:3)

根据Web框架,会话中的对象可能会使用序列化持久保存到磁盘。

答案 4 :(得分:2)

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

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

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