2011-04-20 45 views
1

我目前正在研究一個視頻遊戲,並且我想讓用戶能夠將他們的角色保存到一個新文件中。我知道如何使用文件io(大部分),但我一直使用'serialize'來序列化整個對象(包含字符的所有變量)並將其保存到文件中。問題是我不斷更新對象並對其進行更改,因此當我嘗試使用新對象加載舊字符時,它會出錯並崩潰。相同的級別as-well(一個持有幾個2d數組變量的對象)。在java中存儲數據的更好方法?

必須有更好的方法來做到這一點,以便它與未來的版本兼容。如果有辦法,是否有人會提供一些源代碼和/或一個很好的教程的鏈接?所有的幫助表示讚賞,謝謝!

回答

3

使用XML或嵌入式數據庫(快速和輕量級),如Derby或H2。你甚至可以使用普通的舊屬性文件。

事實上,看看屬性文件是否適合你。只有這樣做不行,請嘗試XML或嵌入式數據庫方法。

0

您可以實現Externalizable而不是Serializable,並且在和writeExternal()方法中,您可以將邏輯讀取/寫入對象。這樣你就可以完全控制序列化/反序列化,並且可以很容易地進行更改。或者,您可以使用Gson使用JSON序列化。我不會推薦XML,但如果你想要,你可以檢查出xstream爲同樣的事情。

0

一個額外的選項來考慮,因爲你已經在使用序列化,你可以實現Externalizable,而不是Serializable。用於序列化對象的代碼將保持不變。然而,在你的班級中,你可以通過覆蓋和writeExternal()來準確指定你想要它的序列。例如:

public class MyClass implements Externalizable { 
    private int foo; 
    private String bar; 

    public readExternal(ObjectInput in) { 
     foo = in.readInt(); 
     bar = in.readUTF(); 
    } 

    public writeExternal(ObjectOutput out) { 
     out.writeInt(foo); 
     out.writeUTF(bar); 
    } 
} 

請務必在讀寫時保持順序不變。儘量只添加字段,但是如果你需要刪除一個字段留下一個空白來說明舊版本。

最終,如果您進行了大量更改,最好切換到LES2建議的屬性或XML文件。這種方式會更便於攜帶和閱讀。

相關問題