2012-08-06 22 views
0

說實話,我不太確定從這個問題開始。 我將描述情況:我正在爲HTML5遊戲製作關卡編輯器。關卡編輯器已經正常工作 - 現在我想用這個編輯器保存/載入關卡。Javascript:如何有效/正確地取消jsonify

由於這一切都是在Javascript(關卡編輯器以及遊戲)中完成的,所以我一直在考慮將保存級別轉換爲JSON和負載,以及將它解開。

的問題是 - 水平包含幾種類型的對象(幾種不同類型的實體,幾種類型的動畫對象,等...)現在,我想的對象加入到遊戲中我必須每次編寫一個專門針對該對象的unjsonify方法,然後修改該級別對象的unjsonify方法,以便它可以處理新定義的對象的類型。

我不能簡單地用JSON.parse,因爲這只是返回相同的按鍵和值作爲原物的對象,但它實際上並沒有那麼類/原型的對象。那麼我的問題是,是否有正確的方法來做到這一點,並不需要每次我想向遊戲添加新類型的對象時不斷修改代碼?

回答

0

我會在每個對象上創建serialise/deserialise方法,以將它們的狀態放入JSON對象並從中恢復它們。複合對象會遞歸地序列化/反序列化他們的孩子。舉個例子:

function Player { 
    this.weapon = new Weapon(); 
} 

Player.prototype.serialise = function() { 
    return {'type': 'Player', weapon: this.weapon.serialise()}; 
} 

Player.deserialise = function(json_object) { 
    var player = new Player(); 
    player.weapon = Weapon.deserialise(json.weapon); 
    return player; 
} 

很明顯,在真實的代碼中,你會檢查以確保你得到了你期望的對象類型。數組和簡單的哈希對象可以在序列化/反序列化過程中簡單地複製,儘管他們的子節點往往需要遞歸。

+0

謝謝!這對我有效。我想知道,雖然...你能想出一種方法來實現這一點在一定程度上?說,例如,地圖類型的構造函數,然後有使用的地圖一般的序列化/反序列化功能(無需編寫單獨的序列化/反序列化每個對象?) – tborenst 2012-08-08 08:02:26

+0

@Xaan是的,我想你可以做的一些類型的對象的自動序列化方法。它可以遍歷對象的屬性和使用hasOwnProperty制定出哪些需要被拯救,但你要想想,你可以應用它,因爲你可能要處理循環引用或其他問題。對於簡單的物體應該沒問題。 – andrewmu 2012-08-08 16:28:00