我们已经发布了一个游戏,它在整个课程中使用NSCoding保存/加载功能。我们现在正在研究下一个版本,但在我们这样做之前,我们需要重构代码,以便它具有更好的性能,并且更容易实现未来的功能(这往往会发生很大变化)。
问题在于审查新设计之后。它具有与先前版本不同的NSCoding层次结构。
1.0 GameSavedFile(使用NSKeyedArchiver) - > UserData - >用户(UserData的父级) - >一堆对象和原语
1.1版 用户(使用NSKeyedArchiver) - >一堆对象和原语
v1.1具有更简单,更直接的结构。在v1.0中,UserData是User的子类,而在v1.1中,我们只对所有用户数据使用一个类。
这种方式更简单,更实用。但是,如何在不破坏任何内容的情况下将所有v1.0数据移植到v1.1?我已经读过有一个setClassName:forClass:方法,但我认为只替换了新类的旧类。
我能想到的最干净,最安全的方法是检查游戏是否仍在使用旧版本(v1.0)。如果是这样,将NSCoding层次结构转换为plist / dictionary,然后在v1.1代码中将其分散。
我对任何可能的建议/解决方案持开放态度,但我更喜欢基础框架中已有的解决方案(如果可能的话)。
感谢。
答案 0 :(得分:2)
当然你应该阅读Forward and Backward Compatibility for Keyed Archives,但它并没有真正解决你的问题。 (无论如何都要读。)
假设您尚未发送v1.1,我的建议如下:
为v1.1创建新的保存文件名。我经常在文件名中包含版本号以简化此操作。这样可以在打开之前轻松判断您尝试阅读的版本。我通常比Apple建议将该版本存储在文件中更好。 (当然,如果更改文件名会造成用户混淆,或者用户可以控制文件名,那么您当然应该将该版本存储在文件中。)
对于v1.0文件,创建仅包含原始数据的V10GameSaveFile
类。然后使用setClassName:forClass:
将序列化对象移动到虚拟类类。
现在您已将结构存储在内存中,将其转换为新的对象模型,重新保存并删除旧文件。