【问题标题】:Best way to store application data when data stored and data format could change in future versions?当存储的数据和数据格式在未来版本中可能发生变化时,存储应用程序数据的最佳方式是什么?
【发布时间】:2011-01-23 11:54:36
【问题描述】:

我正在制作一款 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);.与使用自定义类相比,获取信息有点混乱,但添加额外字段等似乎很容易,无需太多工作。迭代以这种方式存储的列表并不是很好。

【问题讨论】:

    标签: java c++ android serialization file


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在写入序列化内容之前,将版本号写入输出流。我还建议在流的前面写一个魔术字符串序列(只是你可以说是你的——可能是 5 或 6 个字符)。所以你会写魔法,然后你会写你的版本号。然后您将编写您的序列化内容。

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

      这里有几句话要注意:如果可能,请让您在序列化流中使用的类保持简单(字符串、整数等)。如果您使用自己的类,则必须非常小心,不要以会更改包或类名的方式进行重构。

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

      通过分离配置对象的读写,你可以很容易地做到以下几点:

      1. 读取旧配置
      2. 使用旧配置初始化应用 稍后...
      3. 应用创建新配置
      4. 将新配置写入文件

      presto - 即时文件格式更新。

      显然,对于大型复杂的数据图来说,这类事情很难(无论如何需要做很多工作)——但这是您所说的 Android,所以您的持久状态可能并不那么复杂。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 为了记录,我今天刚刚在我大约五年前编写的软件上实现了这种双向兼容性,并且我为(Boost.Serialization 仍然没有'不支持前向兼容性)。这是必需的,因为该软件已被多家公司投入生产使用,产生了一堆需要在新程序版本中保持可用的已保存项目。因为更新不会在所有地方同时进行,所以新文件也应该与旧程序一起使用(如果可能的话)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        相关资源
        最近更新 更多