我想弄清楚如何决定何时使用NSDictionary或NSCoder/NSCoding?
对于一般属性列表而言,似乎NSDictionary是一种简单的方法,可以生成在应用程序之外可以轻松编辑的XML文件.
当处理保存数据或可能嵌套在其中的其他自定义类的自定义类时,似乎NSCoder/NSCoding将是更好的路径,因为它将遍历所有包含的对象类并在使用存档命令时对它们进行编码.
NSDictionary似乎需要更多的工作才能将所有属性或数据特性提供到单个级别才能保存它,而NSCoder/NSCoding会自动编码实现NSCoding接口的嵌套自定义类.
除了它是二进制数据并且在您的应用程序之外不可编辑之外是否真的有理由使用其中一个?沿着这些方向,是否有指示您应该在两者之间倾斜的方式?我错过了一些明显的东西吗
Apple关于对象图的文档有这样的说法:
Mac OS X序列化存储了一个简单的值对象层次结构,例如字典,数组,字符串和二进制数据.序列化仅保留对象的值及其在层次结构中的位置.在反序列化时,对同一值对象的多次引用可能会导致多个对象.不保持对象的可变性.
...
Mac OS X存档存储任意复杂的对象图.归档保留了图中每个对象的标识以及它与图中所有其他对象的所有关系.取消归档时,重建的对象图应该是原始对象图的精确副本,除了少数例外.
我解释这个的方式是,如果你想存储简单的值,序列化(例如使用NSDictionary)是一个很好的方法.如果要存储任意类型的对象图,保留唯一性和可变性,使用归档(例如,使用NSCoder)是最好的选择.
您可能还想阅读Apple的Cocoa档案和序列化编程指南,其中关于对象图的上述链接页面是其中的一部分,因为它很好地涵盖了这个主题.
我不喜欢使用NSCoding/NSCoder/NSArchiver(我们需要选择一个名字!)来将对象图序列化为文件.
以这种方式创建的档案非常脆弱.如果你保存类Foo的对象,那么你需要确保当你加载数据时,你的应用程序中有一个类Foo.
从与其他应用程序共享文件或甚至转发与您未来应用程序的兼容性的角度来看,这使得基于NSCoder的序列化变得困难.