Objective c 如何更改NSKeyedArchiver中编码的对象的层次结构?

Objective c 如何更改NSKeyedArchiver中编码的对象的层次结构?,objective-c,Objective C,我们已经发布了一个游戏,它在类中使用NSCoding保存/加载功能。我们现在正在开发下一个版本,但在此之前,我们需要重构代码,使其具有更好的性能,并且更容易实现未来的功能(这往往会发生很多变化) 问题是在审查了新设计之后。它与以前的版本具有不同的NSCoding层次结构 v1.0 GameSavedFile(使用NSKeyedArchiver)->UserData->User(UserData的父级)->一堆对象和原语 v1.1 用户(使用NSKeyedArchiver)->一堆对象和原语 v1

我们已经发布了一个游戏,它在类中使用NSCoding保存/加载功能。我们现在正在开发下一个版本,但在此之前,我们需要重构代码,使其具有更好的性能,并且更容易实现未来的功能(这往往会发生很多变化)

问题是在审查了新设计之后。它与以前的版本具有不同的NSCoding层次结构

v1.0 GameSavedFile(使用NSKeyedArchiver)->UserData->User(UserData的父级)->一堆对象和原语

v1.1 用户(使用NSKeyedArchiver)->一堆对象和原语

v1.1具有更简单、更直接的结构。在v1.0中,UserData是User的一个子类,而在v1.1中,我们将只对所有用户数据使用一个类

这样更容易,也更实用。但是,如何将所有v1.0数据移植到v1.1而不中断任何内容?我已经读到有一个setClassName:forClass:method,但我认为它只会用新类替换旧类

我能想到的最干净、最安全的方法是检查游戏是否仍在使用旧版本(v1.0)。如果确实如此,请将NSCoding层次结构转换为plist/字典,然后将其分散在v1.1代码中

我对任何可能的建议/解决方案开放,但我更喜欢在基础框架中已经可用的解决方案(如果可能的话)。 谢谢。

当然你应该阅读,但这里并没有真正解决你的问题。(还是读吧。)

假设您尚未发布v1.1,我的建议如下:

  • 为v1.1创建新的保存文件名。我经常在文件名中包含版本号以简化此操作。这使得在你打开它之前,很容易分辨出你想要阅读的版本。与苹果建议将版本存储在文件中相比,我更喜欢这个。(当然,如果更改文件名会造成用户混淆,或者用户可以控制文件名,那么您当然应该将版本存储在文件中。)

  • 对于v1.0文件,创建像
    V10GameSaveFile
    这样只保存原始数据的类。然后使用
    setClassName:forClass:
    将序列化对象移动到伪类

  • 现在内存中已经有了结构,请将其转换为新的对象模型,重新保存并删除旧文件


工作正常。谢谢但这是一个好办法吗?我和老板讨论过这个问题。他一直告诉我不要在保存/加载时包含任何特定于版本的代码。当然,我可以为空字段分配默认值,但当层次结构更改时,我看不出特定于版本的代码为什么不好。在许多情况下,加载特定于版本的代码是绝对必要的。它应该与加载代码隔离,这样您就不必在程序的其余部分担心它,但是程序中必须有一些部分知道旧的模式。