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

15

我一直在开发一个Java Web应用程序,其中框架要求所有内容都必须是可序列化的。我猜想这不仅限于该框架,而是适用于Java中的Web应用程序。我的问题是:框架/服务器/任何其他东西正在做哪些事情使其序列化?它必须这样做吗?

注意:我对Web应用程序或序列化知之甚少。


相关条目:http://bit.ly/de9m0 - OscarRyz
5个回答

16

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

序列化是保存对象的状态,并能够在以后的时间重新组成该状态。


1
由于Servlet会话可以保存任何类型的对象,因此它们应该实现Serializable接口。 - OscarRyz

11

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

  • 用户会话可以在请求之间序列化到磁盘中。当同一用户之间的请求时间远远大于处理请求所需的时间时,这可以大幅减少服务器的内存使用,并使您能够为更多的用户提供服务。
  • 如果您使用负载均衡将请求分布到多个服务器上,您要么需要确保同一用户的所有请求始终由同一台机器提供服务(这会降低负载均衡器的灵活性),要么需要能够通过序列化在服务器之间移动会话数据。

3

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

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

另一个用途是保存状态。您可能有一个游戏,并且想要保存游戏板的精确状态。您可以对Board对象进行序列化,随后可以告诉它序列化其每个Tile。


3

根据web框架的不同,会使用序列化将会话中的对象持久化到磁盘上。


2
如果您正在使用企业Java Bean(EJB),并且有一个无状态会话Bean API,则每个SSB实例在一个线程上运行在一个Java虚拟机上,而其客户端则在不同的线程中运行,通常在不同的JVM上和不同的计算机上。因为您无法从一个JVM传递对Java对象的引用,所以对象需要被序列化为字符串,发送到另一个JVM,然后再反序列化回对象。这种序列化/反序列化发生在传入的参数和返回值上。
如果您正在使用Java消息服务,则每个消息发送的对象将被序列化为字符串,持久化到数据库中,然后由消息接收者在其他时间和地点进行反序列化。
正如Will Hartung指出的那样,HTTP会话对象通常在JVM之间共享。如果您有一组Glassfish Java EE应用程序服务器运行电子商务应用程序,则每个客户端请求都会负载均衡到任何可用的服务器,并且该服务器必须能够查找客户端的会话状态(客户名称、购物车等)。它只能通过序列化来获取此信息。会话状态也可能被写入磁盘(例如,数据库)以确保安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接