在Java中存储数据的更好方法?

| 我目前正在从事电子游戏,我希望用户能够将其角色保存到新文件中。我知道如何使用文件io(大部分情况下),但是我一直在使用\'serialize \'来序列化整个对象(包含字符的所有变量)并将其保存到文件中。问题是我不断地更新对象并对其进行更改,因此当我尝试用新对象加载旧字符时,它会出错并崩溃。同样也与关卡相同(一个对象包含一些二维数组的变量)。 必须有更好的方法来做到这一点,以便与将来的版本兼容。如果可以的话,有人可以提供一些源代码和/或一个不错的教程的链接吗?感谢所有帮助,谢谢!!!
已邀请:
使用XML或嵌入式数据库(快速且轻量级),例如Derby或H2。您甚至可以使用普通的旧属性文件。 实际上,请查看属性文件是否适合您。并且只有在那行不通的情况下,才尝试使用XML或嵌入式数据库方法。
如果您正在寻找Java序列化器,则这里是您的基准https://github.com/eishay/jvm-serializers/wiki/ Apache Avro的性能似乎不错。 另一种方法是将值存储在HSQLDB或H2 db之类的持久性存储中,并在启动时将其加载到内存中,并在需要时持久化。您还可以使用SQLite(用于驱动程序检查)
您可以实现
Externalizable
而不是Serializable,并且在
readExternal()
writeExternal()
方法中,可以放置逻辑以读取/写入对象。这样,您可以完全控制序列化/反序列化,并且可以轻松进行更改。另外,您可以使用Gson使用JSON序列化。我不建议使用XML,但是如果您愿意,可以查看xstream以了解相同的内容。
如果您以向后兼容的方式扩展对象,即添加字段,而不删除字段。确保已根据可序列化的javadoc声明了serialVersionUID。 http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html
由于您已经在使用序列化,因此需要考虑的另一种选择,您可以实现
Externalizable
而不是
Serializable
。用于序列化对象的代码将保持不变。但是,在您的课堂上,您将通过覆盖
readExternal()
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文件。这样,它将更具可移植性和可读性。
该游戏使用
java.util.prefs.Preferences
跨平台使用。由于密钥是单独存储的,因此新添加的内容很少会干扰现有条目。

要回复问题请先登录注册