9

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

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

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

NSDictionary 似乎需要更多的工作才能将所有属性或数据特征放到一个级别才能保存它,因为 NSCoder/NSCoding 会自动编码实现 NSCoding 接口的嵌套自定义类。

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

4

4 回答 4

9

苹果关于对象图的文档有这样的说法:

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

…</p>

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

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

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

于 2008-09-29T15:27:49.897 回答
5

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

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

从与其他应用程序共享文件的角度来看,这使得基于 NSCoder 的序列化变得困难,甚至与您未来的应用程序兼容。

于 2008-09-29T17:53:24.993 回答
2

我忘了列出我会推荐的东西。

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

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

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

于 2008-09-29T18:40:15.580 回答
1

我想你有点糊涂了,NSDictionary 是一种数据结构,它也恰好实现了 NSCoding 协议。因此,从本质上讲,您可以将所有数据放入 NSDictionary 并稍后对其进行编码,或者您可以实现 NSCoding 协议并使用 NSCoder API 对对象树进行编码。根据传入 encodeWithCoder: 方法的 NSCoder 对象的类型,是您的编码的输出。

于 2008-09-29T15:27:01.583 回答