2011-11-24 64 views
0

我正在尋找一個開源庫,它可以用來透明地將Java對象(及其依賴項!)保存到文件或數據庫中,這是一種快照。開源庫將Java對象的樹保存到數據庫或文件

示例用例:我在一堆對象,玩家,樂譜,位置等遊戲中有狀態。用戶單擊「保存」,現在我需要保存這些對象(所有要保存的對象都可以被註釋)到一個文件或數據庫。如果系統崩潰或用戶登錄後,我應該能夠從這一點恢復。

我在尋找一個可以做到儘可能透明和高效的圖書館。交易等是沒有必要的。 我的首要任務將是

  1. 開源,免費,良好的文檔
  2. 易於使用。用戶應該 不必手動保存對象後修改。的 如果他(她)有,它應該是微不足道的活動
  3. 穩定
  4. 應該 很容易從快照讀取和恢復。

是否存在涵蓋上述需求的全部4個或至少很大一部分的庫?我打開面向方面的方法

我問我的用例錯誤的q?該行業的做法是否完全不同?

回答

1

您可以使用標準的Java序列化機制。如果您想要保存的所有類實現標記界面Serializable,則可以透明地將其保存爲您想要的對象圖。它不是數據庫,它是文件,但是您可以隨時將這些對象讀回您的應用程序,這可能是您最好的(或第一個)選項。

該方法的缺點是數據是二進制數據,即無法使用記事本讀取數據。格式對類中所做的更改非常敏感,所以支持向後/向前兼容性是有問題的。

其他可能性是將對象序列化爲XML或JSON。對於XML,請嘗試JAXB或XStream。對於JSON看看here

+0

JSon似乎是一個不錯的選擇。我可以將這種圖表保存到nosql數據庫中,比如說mongodb,然後快速讀取它。這是一個好方法嗎? – Abe

1

您應該能夠使用內置在Java序列化來解決這個問題。如果您希望自動保存,請將模型包裹在可爲您保存的圖層中。這甚至可以使用代理(java.lang.reflect.Proxy)「自動」完成。

但是,我通常不建議自動保存狀態,因爲值通常是相關的。設想一個進度課程,可以跟蹤您所處的級別以及您獲得的級別(例如0%,25%,50%和75%)。

現在,您剛剛完成2級,所以進度必須更新爲「3級,0%」。如果你第一次設定的水平,進展將(短期)的狀態「3級,75%」這是不正確的,如果你設置了多遠,你會得到「2級,0%」。如果程序在這些點中的任何一個處停止,則用戶將具有不正確的狀態。

+0

這是在java遊戲服務器中完成的方式嗎?序列化對象圖,保存(手動)。重新加載它。 – Abe

+0

以某種方式對狀態進行序列化,或者通過某種內置機制或其他邏輯(爲了穩定性,我認爲後者更常見)。 你是什麼意思「手動」保存它?它不一定是用戶按下保存按鈕,它可能是你的程序每x分鐘保存狀態或在遊戲中執行特定任務。 爲什麼你需要重新加載它? (我可以理解,保存它隨着你去,並加載它,如果你想要達到一個較舊的狀態,但保存 - 立即重新加載?) –

+0

我不想立即重新加載它。實際上,我的意思是程序員必須在每次更新POJO後手動編碼保存部分。而不是通過aop或某種此類解決方案進行透明處理。但正如你所說,這可能會導致狀態不一致,並且是一個糟糕的主意。 – Abe