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

Java 为什么需要实现可序列化接口?,java,serialization,web,nlb,Java,Serialization,Web,Nlb,为了解决粘性会话的问题,我们做了很多事情,其中之一就是让会话属性实现可序列化接口。现在,有人能用外行的术语向我解释一下当这个接口被实现时会发生什么吗?在实现此接口的类中观察到哪些行为变化?使会话数据可序列化是最佳做法。这允许servlet容器将会话内容存储在磁盘上,或者通过网络将会话内容传输到另一台服务器 在重新启动的情况下,web容器可能会尝试通过序列化存储在会话作用域中的所有数据来实现“故障转移”策略,以便在重新启动完成后恢复数据-这仅在此类数据实现可序列化时才起作用 前面的一篇JSF文章也

为了解决粘性会话的问题,我们做了很多事情,其中之一就是让会话属性实现可序列化接口。现在,有人能用外行的术语向我解释一下当这个接口被实现时会发生什么吗?在实现此接口的类中观察到哪些行为变化?

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

在重新启动的情况下,web容器可能会尝试通过序列化存储在会话作用域中的所有数据来实现“故障转移”策略,以便在重新启动完成后恢复数据-这仅在此类数据实现可序列化时才起作用


前面的一篇JSF文章也解释了相同的

可序列化类的实例可以使用Java标准序列化机制进行序列化,使用
java.io.ObjectOutputStream.writeObject写入流,然后使用
java.io.ObjectInputStream.readObject读取流,Web服务器需要跨多个请求保存会话数据。在集群环境中,这些请求可能由共享相同会话数据的不同web服务器提供服务。在一个web服务器中更新会话数据时,需要跨其他web服务器复制更新的会话数据。为此,我们需要将会话数据转换为可以通过网络发送的数据。这种转换称为序列化。相反的过程称为反序列化

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

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

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

无法安全地序列化,因为我们无法序列化一个web服务器的“运行时”,并将其发送到其他web服务器。您可以阅读有关Java序列化的更多详细信息。

可序列化的
接口仅仅是一个标记接口。从应用程序服务器和粘性会话的角度来看,应该将会话属性标记为可序列化以用于复制和群集。@Manish不这么认为。。我实际上提到了一个实际情况。