2014-06-11 34 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

相關問題