在未来版本中存储数据和数据格式可能会发生变化时存储应用程序数据的最佳方法

时间:2010-03-04 01:33:45

标签: java c++ android serialization file

我正在制作Android Java应用程序游戏(虽然这个问题确实适用于所有语言),并希望尽快发布第一个版本。我对如何在游戏中保存数据感到紧张。我的问题是,如果在以后的更新中,我决定以不同的方式存储更多数据或存储相同的数据,我需要小心我不会丢失或损坏升级用户的数据(即我希望用户能够使用新版本中旧版本创建的数据,比如之前的高分。

例如,假设我想在版本1中保存高分,我使用类似的类:

class Score { String name; int score; }

然后我将分数存储在ArrayList中,然后,为了保存/加载分数,我将ArrayList对象序列化。

在1.1版本中,我可能决定将每个分数存储在日期中。然后,我可以更新Score对象以包含日期字段,并在旧对象不包含日期时使用日期的默认值。

在版本1.2中,我可能决定将分数存储在TreeSet中而不是版本1.3中,也许我想在线加载/存储分数。

无论如何,我的观点是,有什么一般的提示让我的生活变得轻松吗?我特别关注上述情况,其中一个人从1.1升级到1.2,一个人从1.0升级到1.2。测试数据损坏的所有方案听起来很头疼。

这真的只是一个思考很难选择一些合理且可扩展的东西吗?

我认为从String-> Object使用HashMap作为通用存储对象可能很容易。 storage.put(“HighScoreName1”,“Bob”); storage.put(“HighScorePoints1”,15);.获取信息比我使用自定义类有点麻烦,但似乎很容易添加额外的字段等等而没有太多工作。迭代以这种方式存储的列表并不是很好。

3 个答案:

答案 0 :(得分:2)

如果您使用的是SQLiteOpenHelper,请查看onUpgrade方法。

  

当数据库需要时调用   升级。实施应该   使用此方法删除表,添加   表,或做任何它需要的东西   升级到新架构版本。

答案 1 :(得分:2)

在编写序列化内容之前,将版本号写入输出流。我还建议在流的前面写一个神奇的字符串序列(你可以说是你的东西 - 可能是5或6个字符)。所以你会写MAGIC,然后你会写你的版本号。然后你会写下你的序列化内容。

从磁盘读取相当简单 - 阅读并确认魔法。阅读版本。反序列化,然后将反序列化的内容传递给基于魔法的处理程序。

但请注意以下几点:如果可能,请保持序列化流中使用的类简单(String,Integer等)。如果你使用自己的类,你必须非常小心,你永远不必以改变包或类名的方式重构。

尽管使用序列化将业务对象写入存储可能很诱人,但从长远来看,这几乎总是一个错误。相反,我强烈建议开发一个Configuration对象。您的应用程序从Configuration对象初始化自己。在保存时,应用程序构造一个Configuration对象。然后,一旦发布,您永远不会更改Configuration类。只需创建一个新的(子分类很好)。

通过分离读取和写入配置对象,您可以非常轻松地执行以下操作:

  1. 阅读旧配置
  2. 使用旧配置初始化应用 后来...
  3. App创建新配置
  4. 将新配置写入文件
  5. presto - 即时文件格式更新。

    显然,对于大而复杂的数据图,这类事情很难(很多工作) - 但这是你正在谈论的Android,所以你的持久状态可能不那么复杂。

    请注意,保存为XML,甚至保存到SQL数据库只是上述策略的另一种形式。

答案 2 :(得分:1)

没有明确的答案,但您正在寻找的术语是版本控制。最佳的序列化实现(和文件格式)可以双向工作(旧版本的应用程序可以读取新版本的文件,反之亦然)。