NSCoder vs NSDictionary,你何时使用什么?

时间:2008-09-29 14:48:07

标签: cocoa

我正在试图弄清楚如何决定何时使用NSDictionary或NSCoder / NSCoding?

对于一般属性列表而言,似乎NSDictionary是一种简单的方法,可以生成在应用程序之外可以轻松编辑的XML文件。

当处理保存数据或可能嵌套在其中的其他自定义类的自定义类时,似乎NSCoder / NSCoding将是更好的路径,因为它将遍历所有包含的对象类并在归档命令时对它们进行编码用过的。

NSDictionary中似乎将采取更多的工作来获得所有属性或数据特性单电平,以能够保存它,那里的NSCoder / NSCoding会自动编码实现NSCoding接口的嵌套自定义类。

除了二进制数据并且在您的应用程序之外无法编辑之外,是否真的有理由使用一个而不是另一个?沿着这些方向,是否有指示您应该在两者之间倾斜的方式?我错过了一些明显的东西吗?

4 个答案:

答案 0 :(得分:9)

Apple关于object graphs的文档有这样的说法:

  

Mac OS X序列化存储了一个简单的值对象层次结构,例如字典,数组,字符串和二进制数据。序列化仅保留对象的值及其在层次结构中的位置。在反序列化时,对同一值对象的多次引用可能会导致多个对象。不保持对象的可变性。

     

...

     

Mac OS X档案存储任意复杂的对象图。归档保留了图中每个对象的标识以及它与图中所有其他对象的所有关系。取消归档时,重建的对象图应该是一个原始对象图的精确副本,除了少数例外。

我解释这个的方式是,如果你想存储简单的,序列化(例如使用NSDictionary)是一个很好的方法。如果你想存储任意类型的对象图,保留唯一性和可变性,使用档案(例如NSCoder)是最好的选择。

您可能还想阅读Apple的Archives and Serializations Programming Guide for Cocoa,其中对象图上的上述链接页面是其中的一部分,因为它很好地涵盖了这一主题。

答案 1 :(得分:5)

NOT 使用NSCoding / NSCoder / NSArchiver(我们需要选择一个名字!)来将对象图序列化为文件。

以这种方式创建的档案非常脆弱。如果你保存了类Foo的对象,那么你需要确保当你加载数据时,你的应用程序中有一个类Foo。

这使得基于NSCoder的序列化很难从与其他应用程序共享文件的角度出发,甚至可以转发与未来应用程序的兼容性。

答案 2 :(得分:2)

我忘了列出我推荐的内容。

NSCoding在某些情况下可以正常:如果你只是做一些快速而简单的事情(尽管你必须编写很多代码 - 每个类要编译两个方法)。如果您不担心与其他应用程序的兼容性,也可以。

通过属性列表导出/导入(可能使用NSPropertyListSerializaion类)是一个很好的解决方案。基于XML的plist易于创建和编辑。 plists的主要优点是您不会将文件格式与应用程序捆绑在一起。

您还可以使用NSXMLDocument API和朋友创建自己的基于XML的文件格式并对其进行读/写。这实际上并不比使用属性列表更多。

答案 3 :(得分:1)

我认为你有点困惑,NSDictionary是一种数据结构,它也恰好实现了NSCoding协议。因此,实质上,您可以将所有数据放入NSDictionary中,稍后对其进行编码,也可以使用NSCoder API实现NSCoding协议并对对象树进行编码。基于传递给encodeWithCoder:方法的NSCoder对象的类型,是您的编码的输出。