2014-06-11 70 views
1

为了解决粘滞会话问题,我们做了很多事情之一是让会话属性实现可序列化的接口。现在有人能够以通俗的语言向我解释当这个接口被实现时会发生什么?在实现此接口的类中观察到什么行为变化?为什么需要实现可串行化接口?

+0

'Serializable'接口只是一个标记接口。从应用程序服务器和粘性会话的角度来看,应该将会话属性标记为可序列化以用于复制和聚类。 – Kon

+1

@Manish不这么认为..我已经提到了一个实际的场景。 – Shivayan

回答

1

这是使会话数据可串行化的最佳实践。这允许servlet容器将会话的内容存储在磁盘上,或者将会话内容通过网络传输到另一个服务器。

在重新启动的情况下,Web容器可能尝试通过尝试序列化存储在会话范围中的所有数据来实现“故障转移”策略,以便在重新启动完成后恢复数据 - 这将仅适用于如果这样的数据实现Serializable。

先前的JSF后也解释了Serializable类的相同JSF backing bean should be serializable?

0

一个实例可以使用Java标准序列mechanizm被序列化,写入到一个流与java.io.ObjectOutputStream.writeObject后来与java.io.ObjectInputStream.readObject

2

网络阅读服务器需要跨多个请求保留会话数据。在群集环境中,这些请求可能由不同的Web服务器提供服务,这些Web服务器共享相同的会话数据。当会话数据在一个Web服务器中更新时,更新的会话数据需要在其他Web服务器上复制。为此,我们需要将会话数据转换为可通过网络发送的内容。这种转换称为序列化。相反的过程称为反序列化。

当我们声明一个类作为实现Serializable时,我们需要保证类可以被安全地序列化和反序列化。如果会话数据实现Serializable,则Web服务器可以安全地序列化和反序列化会话数据。 Web服务器不会尝试对未实现Serializable的会话数据进行序列化和反序列化,因为不能保证可以安全地对该类进行序列化和反序列化。

这里的关键是如果你的类实现了Serializable,你需要确保它可以被安全地序列化和反序列化。例如,此类

class MyClass { 
    private Runtime runtime = Runtime.getRuntime(); 
} 

不能安全序列化,因为我们无法序列的一个Web服务器的“运行”,并将其发送到其他Web服务器。有关Java序列化的更多详细信息,请阅读http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

相关问题