2

我正在开发一个应用程序,它应该可以保存/加载数据。大多数数据存储在类的实例中。实例中的数据包括:

  • 一个double[][]数组
  • 一些String, int, bool和一些枚举器

我有多个这些实例+一些我想存储在单个文件中的全局数据。

到目前为止,我将所有内容保存为二进制数据,使用

DataOutputStream out = new DataOutputStream(FileOutputStream(file));
out.writeInt()/writeBoolean()/writeUTF()/etc

这很好用,问题是它不是很灵活。如果我向容器类添加/删除一些变量,则没有简单的方法来保持旧格式兼容。我开始使用在文件开头添加的版本号。但这会导致每个格式版本都有一个大的 loadData/closeData 方法。

基于文本的文件是不可能的,因为它们为我的双数组使用了太多空间。

你知道解决这个问题的好方法吗?即定义一种不会产生大量代码的向后兼容格式?任何建议表示赞赏。

我正在考虑的一个想法是用一个标识该变量的整数来标记每个变量。所以格式是[identifier1][variable1(String)][identifier2][variable2(double[][])]....

我也想过序列化,但我没有任何经验,也不能真正判断这是否是正确的方法。

如果您需要有关数据或一些示例的更多信息,请发表评论。

4

4 回答 4

2

http://code.google.com/p/protobuf/是谷歌很好的跨平台(和跨语言)存储数据的方式,已经具备向后兼容性,可以尝试一下。

特别是文档的这一部分与您的案例有关:

可以轻松引入新字段,不需要检查数据的中间服务器可以简单地解析并传递数据,而无需了解所有字段。

于 2012-08-03T14:34:24.017 回答
1

某种本地数据库怎么样,比如SQLiteJavaDB?非常轻量,省去了标记变量的麻烦,允许灵活地选择检索数据。

于 2012-08-03T14:38:12.980 回答
1

不要走序列化路径......它充满了石头和不兼容。一旦更改了数据对象,一切都将被破坏。Google protobuf 是一个非常好的解决方案。在 c++ 中使用过一次

了解如何配置文件格式需要付出一些努力,但这肯定是值得的。

于 2012-08-03T14:48:33.447 回答
1

我在使用时从来没有遇到过任何问题Serialization,在使用序列化时应该注意的事情很少。

/////-----------什么时候序列化失败----/////

-当一个实例变量被删除时。

-当实例变量的数据类型改变时。

-非静态实例变量变为静态实例变量时。

-非瞬态实例变量变为瞬态变量时。

-当一个类在层次结构中向上或向下移动时

-序列化类变为非序列化时。

/////-----------当序列化不生效时----------------/////

- When Instance variable is added.

- When the access-specifier of the Instance variable is changed.

- When the transient Instance variable gets converted to non-transient Instance variable.

- When you add or remove classes.

于 2012-08-03T15:38:43.303 回答