【问题标题】:Is there a better way to serialize plist-y objects in Objective-C?有没有更好的方法在 Objective-C 中序列化 plist-y 对象?
【发布时间】:2009-10-30 21:39:31
【问题描述】:

我喜欢小对象集合的 plist 序列化功能:它很简单,存储是 XML 等。但是我发现在字典中设置值很麻烦:

[myDict setObject:keepThis forKey:@"ivar"];

我更喜欢使用类派生的对象(甚至只是结构):

myObj.ivar = keepThis

... 然后向集合发送消息以获取 plist。可以限制用于此目的的类/结构,以便它们直接轻松地映射到 plist 原语;例如,myObj 可以映射到 NSDictionary,并且可以对 ivars 提出要求,使其成为 plist 原语之一。

有人已经为此建造了设施,还是我应该自己动手?

【问题讨论】:

    标签: iphone objective-c macos plist


    【解决方案1】:

    我不确定这就是你所说的,但Key Value Coding 将让你get a dictionary with values from an instance's data 和set instance data from a dictionary 等等。

    ask an instance for a list of its attributes 也有一种方法,但事实证明,您必须自己编写一些代码才能使其工作。 (不过,如果您愿意,可以使用 runtime introspection 来实现它。)2011 年 1 月 2 日编辑: -[NSObject attributeKeys] 不再出现在 iOS 文档中。我已经编辑了指向 Mac 文档的链接,但请注意,这可能只是该平台上的一个选项。

    (NSCoding 协议是让您的对象存储/恢复自身的另一种方式,但存储是二进制的,而不是 XML,并且当系统要求您获取/放置您关心的每个值时,您仍然负责这样做。)

    【讨论】:

    • 要记住的另一件事是属性列表序列化会杀死您序列化的对象的身份。如果您需要保持该身份,请使用NSCoding 和NSKeyedArchiver 等。
    • 但是......要“从实例的数据中获取包含值的字典”,您需要有一个实现非正式协议 NSKeyValueCoding 的对象。例如,NSManagedObject 没有实现该协议的这个消息。因此,再次回到运行时自省,或者可能使用 Core Data 的实体类来分离对象。此外,NSCoding 似乎非常手动,因为对于添加到类中的每个属性,您都需要去编辑编码器和解码器——即使编码器/解码器是键控的!所以看起来这样的框架并不存在......
    • NSManagedObject 绝对实现了-dictionaryWithKeysForValues:。一般来说,Core Data 广泛建立在键值编码和键值观察的基础上来完成它的工作。
    • 你的意思是 -committedValuesForKeys: ?
    • 不,我的意思是 -dictionaryWithKeysForValues:,我在回答中链接到的 KVC 方法,以及您在之前的评论中所说的 NSManagedObject 没有实现。它确实(以及更多的 KVC 和 KVO)。
    【解决方案2】:

    您可能想查看this SO question,其中讨论了在运行时将实例的 ivars 放入字典中。

    【讨论】:

      【解决方案3】:

      一个有趣的项目。 Objective-C 2.0 Programming Guide 有一个关于运行时函数的部分,用于动态获取类属性的列表:

      objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
      

      有了这个,应该很容易在NSObject上写一个类别,方法是获取属性列表并将它们放入字典中。

      【讨论】:

      【解决方案4】:

      为了为此使用属性,您需要有一组预定义的可能键。您不能在点语法中使用任意名称——它必须是第一个操作数的已知属性或访问器。所以不可能有一个通用的形式。但如果你自己制作一本,变成字典就像[self dictionaryWithValuesForKeys:listOfProperties] 一样简单。

      【讨论】:

      • 正如 Ole Begemann 所指出的,您可以向运行时请求类的属性列表。 NSObject 还定义了属性键(尽管您最终必须编写支持它的 NSClassDescription)。
      【解决方案5】:

      我在其他地方看到过这个帖子,但这正是我想要的。上面的答案指向原料,但在这里,一切都结束了:http://retaincount.com/blog/?p=7

      【讨论】:

      • 所以,为了清楚起见,如果这是你现在的答案。 KVC(和-dictionaryWithValuesForKeys:)是否在这些对象上工作?因为这是这个链接解决方案工作方式的重要组成部分......
      • 在我找到这个链接之前,我写了一些可以用于 CD 的东西。我最终将 -attributesByName 发送到与 NSManagedObject 实例关联的实体;它工作正常。因为我必须写一些东西(并且它有效),所以我还没有使用这个包。但我会在下一个项目中查看它。
      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多