我正在开发一个应该可以保存/加载数据的应用程序。大多数数据存储在类的实例中。实例中的数据包括:
double[][]
数组String, int, bool
和一些调查员我有多个这些实例+一些全局数据,我想存储在一个文件中。
到目前为止,我使用
将所有内容保存为二进制数据DataOutputStream out = new DataOutputStream(FileOutputStream(file));
out.writeInt()/writeBoolean()/writeUTF()/etc
这很好用,问题是它不是很灵活。如果我在容器类中添加/删除一些变量,那么仍然没有简单的方法可以使旧格式兼容。我开始使用我在文件开头添加的版本号。但是这会导致每个格式版本都有一个很大的loadData / closeData方法。
基于文本的文件是不可能的,因为它们为我的双数组使用了太多的空间。
你知道解决这个问题的好方法吗?即定义一个向后兼容的格式,不会产生大量的代码?任何建议都表示赞赏。
我想到的一个想法是用标识该变量的整数标记每个变量。因此格式为[identifier1][variable1(String)][identifier2][variable2(double[][])]...
。
我也想过序列化,但我没有任何经验,也无法确定这是否是正确的方法。
如果您需要有关数据或某些示例的更多信息,请发表评论。
答案 0 :(得分:2)
http://code.google.com/p/protobuf/是Google优秀的跨平台(和跨语言)存储数据的方式,其中已经提供了向后兼容性,可以尝试一下。
特别是这部分文档与您的案例有关:
可以轻松引入新字段,而不需要检查数据的中间服务器可以简单地解析数据并传递数据,而无需了解所有字段。
答案 1 :(得分:1)
答案 2 :(得分:1)
不要走序列化路径...... 它充满了石头和不兼容性。一旦更改了数据对象,就会破坏外包。 Google protobuf是一个非常好的解决方案。在c ++中使用它一次
了解如何配置文件格式需要付出一些努力,但这肯定是值得的。
答案 3 :(得分:1)
我使用Serialization
时从来没有遇到任何问题,使用序列化时应该注意的事情很少。
///// -----------序列化何时失败---------------- /////
- 当实例变量被移除时。
- 当Instance变量的数据类型发生变化时。
- 当非静态实例变量成为静态实例变量时。
- 当非瞬态实例变量变为瞬态时。
- 在层次结构中向上或向下移动时。
- 当序列化类变为非序列化时。
///// -----------序列化不受影响时---------------- ///// 强>
- 当实例变量添加时。
- 当Instance变量的 access-specifier 发生更改时。
- 当瞬态实例变量转换为非瞬态实例变量时。
- 添加或删除课程时