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

时间:2011-04-20 04:56:45

标签: java database database-design

我目前正在制作视频游戏,我想让用户能够将他们的角色保存到新文件中。我知道如何使用文件io(大多数情况下),但我一直在使用'serialize'来序列化整个对象(包含该字符的所有变量)并将其保存到文件中。问题是我不断更新对象并对其进行更改,因此当我尝试使用新对象加载旧字符时,它会出错并崩溃。与级别相同(包含少量2d变量数组的对象)。

必须有更好的方法来实现这一点,以便与未来的版本兼容。如果有办法,请有人提供一些源代码和/或指向一个很好的教程的链接吗?感谢所有帮助,谢谢!

6 个答案:

答案 0 :(得分:3)

使用XML或嵌入式数据库(快速轻量级),例如Derby或H2。您甚至可以使用普通的旧属性文件。

实际上,查看属性文件是否适合您。只有当它不起作用时,请尝试使用XML或嵌入式数据库方法。

答案 1 :(得分:1)

如果您正在寻找Java序列化器,那么https://github.com/eishay/jvm-serializers/wiki/

是您的基准

Apache Avro似乎表现不错。

另一种方法是将值存储在持久性存储中,如HSQLDBH2 db,并在启动时将其加载到内存中,并在需要时保留。您还可以使用SQLite(用于驱动程序)检查this

答案 2 :(得分:0)

您可以实现Externalizable而不是Serializable,并且在readExternal()writeExternal()方法中,您可以将逻辑用于读取/写入对象。这样您就可以完全控制序列化/反序列化,并且可以非常轻松地进行更改。或者,您可以使用Gson来使用JSON序列化。我不推荐使用XML,但如果您愿意,可以查看xstream同样的内容。

答案 3 :(得分:0)

如果要以向后兼容的方式扩展对象,即添加字段,而不是删除字段。确保已根据可序列化的javadoc声明了serialVersionUID。

http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

答案 4 :(得分:0)

由于您已经在使用序列化,因此需要考虑另外一个选项,您可以实现Externalizable而不是Serializable。用于序列化对象的代码将保持不变。但是,在您的课程中,您可以通过覆盖readExternal()writeExternal()来准确指定序列化的方式。 E.g:

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文件。它会更加便携和可读。

答案 5 :(得分:0)

game使用java.util.prefs.Preferences以获得跨平台的便利。由于密钥是单独存储的,因此新增内容很少会干扰现有条目。