选择正确的文件格式

时间:2012-08-03 14:29:47

标签: java file serialization format file-format

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

  • 一个double[][]数组
  • 一些String, int, bool和一些调查员

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

到目前为止,我使用

将所有内容保存为二进制数据
DataOutputStream out = new DataOutputStream(FileOutputStream(file));
out.writeInt()/writeBoolean()/writeUTF()/etc

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

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

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

我想到的一个想法是用标识该变量的整数标记每个变量。因此格式为[identifier1][variable1(String)][identifier2][variable2(double[][])]...

我也想过序列化,但我没有任何经验,也无法确定这是否是正确的方法。

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

4 个答案:

答案 0 :(得分:2)

http://code.google.com/p/protobuf/是Google优秀的跨平台(和跨语言)存储数据的方式,其中已经提供了向后兼容性,可以尝试一下。

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

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

///// -----------序列化何时失败---------------- /////

- 当实例变量被移除时。

- 当Instance变量的数据类型发生变化时。

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

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

- 层次结构向上或向下移动时。

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

///// -----------序列化不受影响时---------------- /////

- 当实例变量添加时。

- 当Instance变量的 access-specifier 发生更改时。

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

- 添加或删除课程时