为了解决粘滞会话问题,我们做了很多事情之一是让会话属性实现可序列化的接口。现在有人能够以通俗的语言向我解释当这个接口被实现时会发生什么?在实现此接口的类中观察到什么行为变化?为什么需要实现可串行化接口?
回答
这是使会话数据可串行化的最佳实践。这允许servlet容器将会话的内容存储在磁盘上,或者将会话内容通过网络传输到另一个服务器。
在重新启动的情况下,Web容器可能尝试通过尝试序列化存储在会话范围中的所有数据来实现“故障转移”策略,以便在重新启动完成后恢复数据 - 这将仅适用于如果这样的数据实现Serializable。
先前的JSF后也解释了Serializable类的相同JSF backing bean should be serializable?
一个实例可以使用Java标准序列mechanizm被序列化,写入到一个流与java.io.ObjectOutputStream.writeObject
后来与java.io.ObjectInputStream.readObject
网络阅读服务器需要跨多个请求保留会话数据。在群集环境中,这些请求可能由不同的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. 为什么我们要实现接口?
- 2. Java为什么需要实现一个接口?
- 3. 为什么Serializable接口不需要实现readObject()和writeObject()
- 4. 实现接口的抽象类不需要方法实现。为什么?
- 5. 为什么javabean必须实现可序列化的接口?
- 6. 为什么序列化需要实现类中的串行版本UID?
- 7. 为什么我需要Iterator接口,为什么要使用它?
- 8. 什么是一个不需要实现的接口?
- 9. 只是描述接口描述实现需要做什么?
- 10. 为什么Golang需要接口?
- 11. 为什么我们需要IAudioRenderClient接口
- 12. 为什么在java中需要接口?
- 13. 为什么要为JAX-RS实现声明一个接口?
- 14. 为什么显式的接口实现?
- 15. 反序列化SortedSet:为什么项目需要实现IComparable?
- 16. 可串行化接口
- 17. 为什么我们需要接口来实现java中的事件监听器?
- 18. 为什么我们需要在实现功能接口时编写“implements InterfaceName”?
- 19. 为什么实现接口的泛型类不需要构造函数?
- 20. 为什么实现接口的Delphi对象需要引用计数?
- 21. 需要实现属性的接口
- 22. 为什么要实现创建Apache Felix服务的接口?
- 23. 为什么我需要我需要在子类中实现IDisposable()
- 24. 为什么priorityQueue在编译时需要可比的接口?
- 25. 为什么实现Serializable接口的类实现none接口的方法?
- 26. C++ 11已实现的接口方法不可用。为什么?
- 27. 为什么F#map实现可变操作的接口?
- 28. 为什么字符串实现可比较而不是比较器接口
- 29. 什么是显式接口成员实现,为什么
- 30. 我什么时候需要InamingContainer接口?
'Serializable'接口只是一个标记接口。从应用程序服务器和粘性会话的角度来看,应该将会话属性标记为可序列化以用于复制和聚类。 – Kon
@Manish不这么认为..我已经提到了一个实际的场景。 – Shivayan