2010-03-11 29 views
2

我正在用Java編寫Android遊戲,我需要一種可靠的方式來快速保存和加載應用程序狀態。這個問題似乎適用於大多數面向對象的語言。健壯的方式來保存/加載依賴關係的對象?

瞭解我需要保存的內容:我使用策略模式來控制我的遊戲實體。這個想法是我有一個非常普遍的實體類,例如商店子彈/播放/敵人的位置,我再附上一個行爲類,告訴實體如何行動:

class Entiy { float x; float y; Behavior b; } 

abstract class Behavior { void update(Entity e); {} 

// Move about at a constant speed 
class MoveBehavior extends Behavior { float speed; void update ... } 

// Chase after another entity 
class ChaseBehavior extends Behavior { Entity target; void update ... } 

// Perform two behaviours in sequence 
class CombineBehavior extends Behavior { Behaviour a, b; void update ... } 

從本質上講,實體對象是容易保存,但行爲的對象可以有一個半複雜的圖形其他實體對象和其他行爲對象之間的依賴關係。我也有行爲對象在實體之間共享的情況。我願意改變我的設計,以使保存/加載狀態更容易,但上述設計對構建遊戲非常有效。

無論如何,我已經考慮的選項有:

  • 使用Java序列化。這在Android中意味着非常慢(我會在某個時候進行分析)。但是,當版本發生變化時,我擔心健壯性。

  • 使用類似JSON或XML的東西。我不知道如何處理存儲對象之間的依賴關係。我是否必須爲每個對象提供一個唯一的ID,然後在加載時使用這些ID來將正確的對象鏈接在一起?我想我可以例如更改ChaseBehaviour以將ID存儲到實體,而不是參考,這將用於在執行行爲之前查找實體。

我寧願避免編寫大量加載/保存代碼,我自己,因爲我覺得它很容易犯錯誤(例如忘記保存的東西,讀出的東西在錯誤的順序)。

任何人都可以給我關於良好格式的任何提示,以節省或設計,使保存狀態更容易嗎?

+0

如果你選擇Java序列化,你可以手動定義一個私有靜態最終的long serialVersionUID以增加健壯性。否則,你會得到一個新的版本,爲每一個小的變化和編譯 – dparnas 2010-03-11 16:46:07

回答

1

你應該在使用之前檢查序列化。我不知道它在Android上的表現如何,但對於Java代碼來說,這是一種已知且高效的方式來保存對象圖。無論如何,你也可以看看對this question的回覆,它考慮使用XML保存對象圖。

+0

謝謝。我讀過谷歌的開發人員說序列化超級超級慢。如果我沒有太多對象(我可能需要保存大約200多個小對象),它可能足夠快。我真的很討厭寫保存/加載代碼;犯錯很容易!我很想知道替代方案。 – mrteacup 2010-03-11 16:42:27

0

您還沒有說過爲什麼要保存/加載狀態。如果你想防止關機,你可能想要看看使用Bundle和PathClassLoader以及onSaveInstanceState和onRestoreInstanceState/onCreate。

+0

如果操作系統決定殺死我的活動,我需要保存狀態,以便玩家可以返回到他們的遊戲。另外,我可以讓玩家隨意保存/恢復遊戲。我知道Bundle等,但是這對我實際存儲數據沒有幫助,因爲常規序列化意味着非常慢。 – mrteacup 2010-03-11 20:03:31