簡體   English   中英

如何保存和加載帶有抽象對象的關卡文件?

[英]How can I save and load a level file with abstract objects?

我正在嘗試制作一個級別編輯器,以提供諸如mario maker之類的保存功能-用戶可以創建一個級別並保存級別數據。 通常如何做? 具體來說,我正在努力的是自己的等級,其中包含一個敵人列表(一個抽象類)。 當我寫文件時,我可以寫出具體敵人類別的json表示形式,但是當我從文件中讀取時,我需要知道它是什么具體類別,以便將其重構為該特定類別。 這似乎很痛苦-我必須手動添加一些代碼來寫出敵人被保存時的類類型,還必須添加代碼以讀取類類型並在讀取時創建該類的實例。 我害怕為我創建的每個新敵人都保持這種狀態。 所以我的主要問題是,如何最輕松地將具體敵人列表讀入抽象敵人列表中? 似乎在保存/加載時需要有關該類的一些知識。

另外,將其另存為JSON還是序列化更好? 有關系嗎?

由於您將在程序啟動時創建具體的類,因此您將需要知道每個類的實際類。 您可以通過多種方法來執行此操作。 為了簡單getLabel() ,您可以向每個具體類添加一個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),檢查標簽,然后2)解析為POJO。

您可以做的另一件事是,在每個JSON字符串之前加一個“幻數”,以讓您知道它是哪種類型。 然后,您不必雙重解析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似乎很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM