2010-06-15 33 views
0

我有一個不實現java.lang.Serializable的會話對象。 (它的遺留應用程序,現在我不能去更改代碼)將會話對象存儲在獨立應用程序中的位置?

有什麼辦法,我可以存儲會話對象的一些地方,後來得到相同的狀態在STANDALONE應用。

一個想到的是用RMI。有沒有更好的方法來實現這一點。

編輯:傳統應用程序具有的API,給我的Session對象。在Session對象上,我將調用這些方法。獲取Session對象是一個非常昂貴的操作。所以,我想將它存儲在一些地方,以便進行任何後續操作,直到會話有效。

謝謝:)

回答

1

假設,你可以詢問你的會話對象,以確定其狀態,並考慮到國家,你可以創建一個新的會話對象,它是等價的。然後你需要一個助手類,它的每個實例都與一個會話對象相關聯,並且是可序列化的。您編寫helper類的序列化來存儲會話的狀態,並且當您通過序列化創建新序列時,它將創建會話。

+0

問題是OP沒有辦法(我認爲)從串行化數據重新創建會話對象。所以你可能能夠得到它的膽量並且序列化它們,但是如果它不暴露方法來允許你手動反序列化....? – 2010-06-16 13:53:27

0

從問題,我認爲你可以將代碼添加到應用程序的外邊緣,但有無處不在「當心和舉例」的招牌。

如果不是序列化,則目標將可能包含對本質上不可序列化的東西,如服務,狀態豆類,...和其他的東西它纔有意義在容器中。現在通常大部分這些東西你可能不需要在容器外面。

RMI不會解決你的問題,因爲那麼有效載荷必須是序列化的,回到原點1

一個務實的做法可能是使用Apache下議院的XML沼氣池一個簡單的XML生成器,如果它仍然存在,或者一些簡單的JSON生成器,然後從獨立應用程序中需要的會話中選擇數據並將其轉儲到合適的樹中。

+0

對不起,我沒有得到實用的方法。 Session對象具有我將要調用的方法。我不會只是讀取其中的數據。我編輯了問題陳述。對不起,如果它不清楚。 – HanuAthena 2010-06-16 04:10:47

+0

謝謝。現在我明白了。序列化位丟掉了我。現在我明白了RMI部分。是的,這似乎是一個好方法:創建一個帶有接口的RMI外觀,以訪問Session對象中的內容/方法,這些內容/方法始終保留在JVM中。 我更喜歡無狀態接口,每個用例都有一個方法傳遞會話ID,但您也可以爲會話的單個實例創建RMI包裝,並將它們發佈到JNDI上下文中以便在獨立客戶端上進行檢索。如果你使用EJB容器,這很容易,對於Spring來說,Spring-Remoting可以提供幫助。 – 2010-06-16 05:39:08

1

如果會話對象確實引用了非序列化的東西(不僅僅是接口方面,而是涉及它持有的非可序列化的有狀態實例),那麼您將很難以有意義的方式重建它。

如果不是這種情況,那麼你可以使用XStream序列化它,即使Serializable接口沒有實現。

幸運的是,這是很容易測試:如果你的重構會話對象爲你工作,你在清澈的很。

+0

我嘗試使用XStream序列化。仍然沒有運氣。我猜,有些屬性是無法序列化的。我收到錯誤:異常發生:com.thoughtworks.xstream.converters.ConversionException:無法調用java.security.CodeSource.readObject():索引:2,大小:2當我嘗試序列化對象。 – HanuAthena 2010-06-16 10:18:08

+0

@HanuAthena,你如何與會話對象進行交互?你甚至無法看到代碼? – 2010-06-16 13:51:45

+0

我可以!我有Session類及其依賴項的jar文件。但Session對象中的很少一些屬性嵌套得很深,有些屬性在試圖序列化時出現錯誤。 – HanuAthena 2010-06-16 14:16:16

相關問題