2015-12-03 30 views
0

我試圖做一個關卡編輯器,提供像馬里奧製造商一樣的保存功能 - 用戶可以創建一個關卡並保存關卡數據。這通常如何完成?具體來說,我正在努力的是我的級別包含一個敵人列表(一個抽象類)。當我寫入一個文件時,我可以寫出具體敵人類的json表示,但是當我從文件中讀取時,我需要知道它是什麼具體類,以便將其重構爲具體的類。這看起來很痛苦 - 我不得不手動添加一些代碼來寫出當它被保存時敵人的類型,還要添加代碼來讀取什麼類的類型,並在讀取時創建該類的實例。我害怕爲每一個我創造的新敵人維持這一點。所以我的主要問題是,我怎樣才能最輕鬆地將一列具體的敵人列入抽象敵人列表?似乎在保存/加載時需要關於該類的一些知識。如何使用抽象對象保存和加載級別文件?

此外,是保存爲JSON的方式去這裏或序列化更好?有關係嗎?

回答

0

既然你要在程序啓動時創建具體的類,你將需要知道每個類的實際類。有很多方法可以做到這一點。要做一些簡單的事情,你可以給每個具體類增加一個getLabel()方法,並用它作爲開關來找出正確的具體類。

// Using jackson-databind 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readValue(json, JsonNode.class); 

Enemy enemy = null; 
if (GOOMBA_LABEL.equals(node.get("label").asText())) 
    enemy = mapper.readValue(json, Goomba.class); 

我真的很喜歡使用JSON庫功能來解析我的JSON到POJO。但是,執行上述操作實際上需要進行雙解析 - 1)解析一些通用結構(如Map或JsonNode),檢查標籤,然後解析爲POJO。

你可以做的另一件事是在每個JSON字符串前加上一個「Magic Number」,讓你知道它是哪一種類型。那麼你不必再解析JSON。

DataInput input = new DataInputStream(fileInputStream); 
int magic = input.readInt(); 

Enemy enemy = null; 
if (GOOMBA_MAGIC == magic) { 
    String json = input.readUTF(); 
    enemy = mapper.readValue(json, Goomba.class); 
} 

只要JSON是正確的序列化使用,這取決於你。對它好的東西是人類可讀和可編輯的。如果性能或磁盤使用對您更重要,還有其他序列化技術。對於這樣的事情,JSON似乎很好。