爲了解決粘滯會話問題,我們做了很多事情之一是讓會話屬性實現可序列化的接口。現在有人能夠以通俗的語言向我解釋當這個接口被實現時會發生什麼?在實現此接口的類中觀察到什麼行爲變化?爲什麼需要實現可串行化接口?
回答
這是使會話數據可串行化的最佳實踐。這允許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. 爲什麼Serializable接口不需要實現readObject()和writeObject()
- 3. Java爲什麼需要實現一個接口?
- 4. 實現接口的抽象類不需要方法實現。爲什麼?
- 5. 爲什麼javabean必須實現可序列化的接口?
- 6. 爲什麼序列化需要實現類中的串行版本UID?
- 7. 爲什麼我需要Iterator接口,爲什麼要使用它?
- 8. 只是描述接口描述實現需要做什麼?
- 9. 什麼是一個不需要實現的接口?
- 10. 爲什麼我們需要IAudioRenderClient接口
- 11. 爲什麼在java中需要接口?
- 12. 爲什麼Golang需要接口?
- 13. 爲什麼要爲JAX-RS實現聲明一個接口?
- 14. 爲什麼顯式的接口實現?
- 15. 反序列化SortedSet:爲什麼項目需要實現IComparable?
- 16. 可串行化接口
- 17. 爲什麼實現接口的Delphi對象需要引用計數?
- 18. 爲什麼實現接口的泛型類不需要構造函數?
- 19. 爲什麼我們需要在實現功能接口時編寫「implements InterfaceName」?
- 20. 爲什麼我們需要接口來實現java中的事件監聽器?
- 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