NSCoder vs NSDictionary,什么时候使用什么?
我试图弄清楚如何决定何时使用NSDictionary或者NSCoder / NSCoding?
对于一般的属性列表而言,似乎NSDictionary是生成XML文件的简单方法,该XML文件可以在应用程序外部轻松地进行编辑。
当处理包含数据的自定义类或者可能嵌套在其中的其他自定义类时,似乎NSCoder / NSCoding会是更好的选择,因为它将在使用归档命令时逐步遍历所有包含的对象类并对它们进行编码。
NSDictionary似乎需要更多的工作才能将所有属性或者数据特征保存到一个级别才能保存它,因为NSCoder / NSCoding会自动编码实现NSCoding接口的嵌套自定义类。
除了二进制数据之外,还不能在应用程序外部进行编辑,是不是真的有理由在另一个应用程序上使用它?沿着这些思路,有一个指标表明我们应该在两者之间靠哪种方式学习?我缺少明显的东西吗?
解决方案
我认为我们有点困惑,NSDictionary是一种数据结构,它也恰好实现了NSCoding协议。因此,从本质上讲,我们可以将所有数据放入NSDictionary中,并在以后对其进行编码,或者可以实现NSCoding协议并使用NSCoder API对对象树进行编码。根据传递给encodeWithCoder:方法的NSCoder对象的类型,是编码的输出。
苹果公司关于对象图的文档说:
Mac OS X serializations store a simple hierarchy of value objects, such as dictionaries, arrays, strings, and binary data. The serialization only preserves the values of the objects and their position in the hierarchy. Multiple references to the same value object might result in multiple objects when deserialized. The mutability of the objects is not maintained. … Mac OS X archives store an arbitrarily complex object graph. The archive preserves the identity of every object in the graph and all the relationships it has with all the other objects in the graph. When unarchived, the rebuilt object graph should, with few exceptions, be an exact copy of the original object graph.
我的解释方式是,如果要存储简单值,则序列化(例如,使用NSDictionary)是一种不错的选择。如果要存储保留唯一性和可变性的任意类型的对象图,最好使用存档(例如使用NSCoder)。
我们可能还需要阅读Apple的Cocoa档案和序列化编程指南,其中对象图的上述链接是其中的一部分,因为它很好地涵盖了该主题。
我不喜欢使用NSCoding / NSCoder / NSArchiver(我们需要选择一个名称!)将对象图序列化到文件。
以这种方式创建的存档非常脆弱。如果保存了Foo类的对象,那么我们很需要确保在将数据加载回时在应用程序中具有Foo类。
从与其他应用程序共享文件的角度,甚至转发与未来应用程序的兼容性,这都使得基于NSCoder的序列化变得困难。
我忘了列出我的建议。
在某些情况下,NSCoding可以:如果我们只是在做快速而简单的事情(尽管我们必须编写很多代码,每个类要序列化两个方法)。如果我们不担心与其他应用程序的兼容性,也可以。
通过属性列表(也许使用NSPropertyListSerializaion类)进行导出/导入是一个很好的解决方案。基于XML的plists易于创建和编辑。编写者的主要优点是我们不会将文件格式仅绑定到应用程序。
我们还可以创建自己的基于XML的文件格式,并使用NSXMLDocument API和朋友对其进行读写。与使用属性列表相比,这确实没有太多的工作。