代码之家  ›  专栏  ›  技术社区  ›  crackity_jones

NSCoder vs NSDictionary,你什么时候用什么?

  •  9
  • crackity_jones  · 技术社区  · 18 年前

    我想知道如何决定何时使用NSDictionary或NSCoder/NSCoding?

    对于一般的属性列表和NSDictionary,似乎是生成XML文件的简单方法,这些XML文件在应用程序之外很容易编辑。

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

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

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

    4 回复  |  直到 17 年前
        1
  •  9
  •   Community Mohan Dere    6 年前

    苹果关于 object graphs 有这样的说法:

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

    MacOSX归档文件存储任意复杂的对象图。存档保留图形中每个对象的标识以及它与图形中所有其他对象的所有关系。未归档时,重建的对象图应该是原始对象图的精确副本,很少有例外。

    我的解释是,如果你想存储简单的 价值观 ,序列化(例如使用NSDictionary)是一种很好的方法。如果你想储存一个 对于保留唯一性和易变性的任意类型,使用归档(例如,使用NSCoder)是最好的选择。

    你可能还想看看苹果的 Archives and Serializations Programming Guide for Cocoa

        2
  •  5
  •   schwa    18 年前

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

        3
  •  2
  •   schwa    18 年前

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

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

        4
  •  1
  •   Elfred    18 年前

    我想你有点困惑,NSDictionary是一种数据结构,它也碰巧实现了NSCoding协议。因此,本质上,您可以将所有数据放入NSDictionary并在以后对其进行编码,也可以实现NSCoding协议并使用NSCoder API对对象树进行编码。根据传入EncoderWithCoder:方法的NSCoder对象的类型,是编码的输出。