有人能告诉我如何为Android保存数据吗?
我有太多的数据需要保存(很多npc-敌人的数据)。另外,它应该在更新后工作:我在堆栈溢出上看到,使用BinaryFormatter
,当您更新或更改类时,您的旧设置可能会因为类不再匹配而丢失。有时,由于这个原因,在读取保存的数据时会出现异常。
我还读到了关于JSON/XML的文章。如果我更改类,JSON/XML会抛出错误吗?
发布于 2017-02-06 00:59:03
如果我希望我的数据具有可读性,我将使用JSON。例如,使用JSON.NET,很容易为字段设置默认值或忽略未知字段。因此,如果从类中添加或删除字段,可能会失去平衡,但不会中断。
但是,什么是太多的数据呢?您是否需要在不偷工减料的情况下序列化数十亿个大型对象?如果是这样的话,JSON可能对您来说太麻烦了。但是当你说大的时候,要小心,这是一个相对的术语,我的直觉告诉我,你说的是序列化相对较少的数据。
如果它确实是大量的数据,并且不需要具有人类可读性,那么您可以使用二进制编写器。这要快得多,但如果没有来自JSON库的所有方便的函数,您需要告诉它要序列化和反序列化的字段。
发布于 2018-02-12 17:07:32
用方形石。真的。我知道这不仅仅是使用序列化程序的工作,但这是所有正常的android应用程序的工作方式,也是正确的方法,我将在下面解释。
有关如何做到这一点,请参见https://github.com/codecoding/SQLite4Unity3d。
如果工作量太大,请使用https://github.com/jacobdufault/fullserializer签出自定义序列化
保存数据的格式与保存大型数据集的方式是正交关系。
这里有两个问题:
让我们逐一解决这些问题:
当模型更改了
反序列化
XML/json序列化程序将在一定程度上解决这个问题,但最终,如果您的数据模型发生更改,则需要使用迁移将旧数据迁移到新模式。
没有办法避免这个问题。
使用弱类型的序列化程序(例如。( json)允许您接收缺少键的空值,但最终,如果字段更改类型,则仍然会有损坏的数据。
永远不要使用BinarySerializer
。
这个问题的标准解决方案是使用数据库,并在每个表的基础上使用迁移迁移数据,就像在编写任何其他类型的数据库驱动程序一样。
虽然android内置了对sqlite和迁移的支持,但统一并不支持;您必须为它编写一些自定义代码。
在反序列化对象时,还可以使用自定义json反序列化器应用迁移“动态”,但是内置的JsonUtility
不支持这一点;您必须使用像https://github.com/jacobdufault/fullserializer这样的自定义序列化程序
现在,不管单个记录的存储格式如何,保存大型数据集的关键是分部分保存。
在sqlite中,将数据划分为每个表。
如果手动序列化,则将数据模型拆分为一系列小对象并逐一保存。
其原因是UI线程在执行诸如保存之类的缓慢操作时会阻塞。这里正确的方法是做一些逻辑上与此等价的事情:
- Split data into records
- Show save progress indicator
- Start a coroutine
-- While there are records left to save:
--- Save a few records
--- `yield` to wait for the next frame and allow the UI to update
这是sqlite真正发光的地方;sqlite自然地被划分为表,表被划分成行。插入几行或更新几行是一个简单的原子操作,很容易分成几个部分。
手工处理序列化对象意味着手动管理包含多个不同序列化对象的文件夹;这是sqlite为您提供的全部服务。
请记住,与任何UI驱动的应用程序单块(大型、缓慢、无所不能)操作一样,不能将操作拆分到多个核上,也不能推迟;为了响应,UI线程上的任务应该定期返回控制,以避免锁定UI。有关android:https://developer.android.com/training/articles/perf-anr.html主题的更多背景信息,请参见以下内容
除非您要保存的数据量微不足道,否则使用直接序列化保存对象几乎肯定不会很好地扩展(许多统一游戏在android上都有ANR问题)。
基本上,如果你从这件事上拿走了什么,应该是这样:
发布于 2017-01-26 02:40:11
您可以使用SQLite(如果需要键值对/Doucument数据库,可以使用UnQLite )或JSON(json包含的浪费字符较少,如果与XML相比删除其中的所有\r\n,则要小得多)。对于json,请使用以下代码:http://www.newtonsoft.com/json
https://gamedev.stackexchange.com/questions/136377
复制相似问题