2013-12-19 71 views
2

層次結構我有一個抽象類Screen和子類:GameScreenSpellScreenStatsScreen序列化對象的Java中

比賽以這種方式工作:一類Renderer創建一個根

Screen screenRoot = new GameScreen() 

然後可以自由添加屏幕,然後可以添加自己的屏幕,所以它。因此形成了一個樹狀結構,每個屏幕都包含其子屏幕列表。

現在我想知道是否可以執行序列化和反序列化 - 我想重新創建同一層次結構中的所有屏幕。

是否足以僅序列化screenRoot對象,然後反序列化它(如果我想保留整個屏幕樹),還是我需要以某種方式遍歷樹?

你會如何去序列化呢?

P.S.該遊戲適用於Android並使用OpenGL ES 2.0。

+2

我建議分離UI,邏輯和數據(MVC),所以你可以使用的POJO作爲用於序列化的簡單類型數據對象(可能使用Json或帶有JAXB的XML) – Sam

回答

3

對象的層次結構並不妨礙使用Java序列化,因爲後者可以處理任意對象圖 - 是的,使用Java序列化序列化對象將序列化它引用的所有對象(除非該引用標記爲transient) 。假設這是你想要的,序列化的層次結構很簡單,只要:

try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(filename)))) { 
    oos.write(rootScreen); 
} 

和閱讀一樣簡單:

try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filename)))) { 
    return (GameScreen) ois.readObject(); 
} 
2

這裏有兩個問題。

首先,屏幕應該就是這樣 - 屏幕。它們不應該包含表示你的遊戲狀態的「模型」或對象數據;只有該狀態的視圖/呈現。所以序列化和反序列化並不合理。我會建議再看看你的架構,看看這是否真的是你想要做的。

如果您決定這麼做,或者您有另一個可以序列化的遊戲狀態對象根(我通常使用Player,因爲它包含所有基本數據),您可以使用Gson輕鬆完成此操作:

// Save 
RootObject o = ...; // The root of the hierarchy to serialize 
Gson gson = new Gson(); 
String serialized - gson.toJson(o); // JSON object, eg. { "Player": { ... } } 

// Load 
RootObject deserialized = gson.fromJson(serialized, RootObject.class); 

你可以在他們的user guide瞭解更多。

其次,關於JSONGson的問題:我比標準序列化更喜歡這個,因爲它面對變化時很健壯。如果你的類定義改變了,你仍然可以反序列化對象(儘管你得到空/空字段)而不是運行時異常;你也不用擔心版本控制你的課程。

編輯:像這樣的問題更適合於Game Dev SE site

+0

我接受meriton的答案,因爲這正是我現在要做的。 – PawelP

+0

雖然你的意見非常有幫助,但我確實發現我計劃的設計遠非實體(SOLID,...)。這遠離MVC,並且有一個緊迫的截止日期(這是我的BSc遊戲:))。 只要學習好的建築學,你有什麼特別的資源可以推薦給我? (側重於實踐/實例而不是理論)。 Gson/Json看起來不錯,我也會試着去學習。 – PawelP

+1

我更新了我的答案,提到爲什麼Gson在序列化方面非常棒。我建議把重點放在你需要完成的最小變化上,並使用「故事」(小的,面向用戶的功能塊)+版本控制。這有很長的路要走。 – ashes999