2012-08-03 74 views
2

我正在研究一个应用程序,它应该可以保存/加载数据。大多数数据存储在类的实例中。在实例中的数据包括:选择正确的文件格式

  • 一个double[][]阵列
  • 一些String, int, bool和一些普查员

我有这些情况下的多+,我想在一个文件中存储一些全局数据。

到目前为止,我都将其保存为二进制数据,使用

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

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

基于文本的文件不存在问题,因为它们为我的双数组使用了太多的空间。

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

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

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

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

+0

“我开始使用我在文件开头添加的版本号”,你的意思是serialVersionUID? – 2012-08-03 14:32:28

+0

@GuilhermeTorresCastro不,我不使用序列化,只是一些整数,我每次改变文件格式的东西都会增加。 – brimborium 2012-08-03 14:33:27

+0

@brimborium它不会工作,这就是为什么我删除了我的初步评论。我认为你可能会更容易地分别序列化类中的每个变量并将这些块编入索引,例如,变量名称 – Qnan 2012-08-03 14:36:09

回答

2

http://code.google.com/p/protobuf/是Google的跨平台(和跨语言)存储数据的好方法,已经向下兼容,可以试试看。

特别的文档,这部分涉及到你的情况:

新的领域可以很容易地推出,而且也没必要检查的数据可以简单地分析它,并通过中间数据服务器而不需要知道所有的领域。

+0

感谢您的建议,这听起来像一个有效的可能性。尽管我对使用协议缓冲区编译器的步骤持怀疑态度。但是,嘿,谷歌使用它,所以它不会那么糟糕。;) – brimborium 2012-08-03 14:45:59

+1

它实际上是一个非常好的库,我从来没有使用它的唯一原因是因为.NET提供了可以在其框架库中进行比较的功能(为了我的需要)。尽管如此,我仍然会阅读很多内容,如果必须再次使用C++编程,我可以肯定地说我会使用它。 – Blindy 2012-08-03 14:50:08

+0

我对protobuff很满意(尽管我不喜欢附加的编译步骤)。感谢您的建议。 – brimborium 2012-08-09 15:31:16

1

某种本地数据库如SQLiteJavaDB?非常轻便,并且可以省去标记变量的麻烦,可以灵活地选择检索数据。

+0

如果数据仅用于该应用程序的相同实例,那可能是一个选项 – Qnan 2012-08-03 14:43:00

+0

我想到了这一点,但我并不是那么喜欢SQL。我认为会有很多开销(代码明智,而不是数据明智),比自己以某种方式做更多... – brimborium 2012-08-03 14:44:28

+0

它似乎没有很多不同类型的数据要保存,你可以通过写一些辅助方法来访问数据库(可变参数是stmt.setObject()的巨大缓解) – 2012-08-03 14:51:12

1

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

了解如何配置文件格式有点费力,但值得肯定。

+0

好吧,对protobuf的第二个建议。我绝对正在考虑这一点。 ;) – brimborium 2012-08-03 14:55:13

+0

请记住,protobuf要求您将.proto文件编译为.java,它可能会在您的开发周期中出现扭结,因为它需要安装protoc程序。这就是说,这是一个快速,灵活的解决方案。 – Matt 2012-08-03 15:00:40

+0

@Matt这就是我实际上不喜欢的。但我几乎可以肯定,有一个eclipse插件,它可以自动完成这些工作。 – brimborium 2012-08-03 15:09:05

1

我从来没有使用过任何问题Serialization,使用序列化时应该注意的几件事情。

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

-当实例变量是删除

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

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

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

-当一个类是或上升在层次下来

-序列类成为非串行化。

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

-当实例变量是时加入

-当实例变量的访问说明符发生更改时。

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

-当你添加或删除类。

+0

感谢此列表。你知道任何关于序列化的好教程吗?我发现的答案并没有真正回答,如何以向后兼容的方式解决“添加/删除实例变量”问题。 – brimborium 2012-08-04 09:52:28

+1

尝试这些链接... http://www.kodejava.org/examples/215.html和http://tutorials.jenkov.com/java-io/serializable.html – 2012-08-04 10:33:34

+0

Thx为教程。我会看看他们:) – brimborium 2012-08-04 11:48:58