为什么需要实现可序列化接口?

时间:2014-06-11 04:58:46

标签: java serialization web nlb

我们为修复粘性会话问题所做的许多事情中,一个是使会话属性实现可序列化接口。现在有人可以用外行的术语向我解释当实现这个接口时会发生什么?在实现此接口的类中观察到哪些行为变化?

3 个答案:

答案 0 :(得分:2)

Web服务器需要跨多个请求保留会话数据。在群集环境中,这些请求可以由不同的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

答案 1 :(得分:1)

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

在重新启动的情况下,Web容器可能会尝试实现"故障转移"策略通过尝试序列化存储在会话范围中的所有数据,以便在重新启动完成后恢复数据 - 这仅在此类数据实现Serializable时才有效。

以前的JSF帖子也解释了相同的JSF backing bean should be serializable?

答案 2 :(得分:0)

可以使用Java标准序列化机制序列化Serializable类的实例,该机制使用java.io.ObjectOutputStream.writeObject写入流,然后使用java.io.ObjectInputStream.readObject读取

相关问题