如何序列化 iPhone sdk 中的简单对象?

Posted

技术标签:

【中文标题】如何序列化 iPhone sdk 中的简单对象?【英文标题】:How do I serialize a simple object in iPhone sdk? 【发布时间】:2009-05-18 02:37:55 【问题描述】:

我有一本对象字典;它们都是应该可序列化的 POCO 对象。我应该看什么技术将这些写入磁盘。我正在寻找最简单的选项来编写一些列表来保存状态。

我想我有 3 个选择。

    plist 文件。然而,这似乎仅限于存储预定义的对象(字符串、数字等)而不是对象(如具有姓名和年龄的人)。

    核心数据。 (3.0 中的新功能)这会很好用;但是我的数据模型需要更改才能使这项工作。这将是一次大规模的返工,我不确定这是否值得。

    SQLLite。实现一个简单的 SQL 数据库来读取和读取。我对此做了最少的研究,但我不想“重写”一些核心数据 ORM 函数。

【问题讨论】:

【参考方案1】:

要序列化自定义对象,您只需遵守NSCoding 协议。如果您的对象扩展了 NSObject,那么您需要做的(我相信)就是实现这些(以 person 对象为例):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder

    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];

// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder

    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];

NSArrayNSDictionary 已经实现了序列化方法。他们将序列化他们持有的所有对象(如果对象实现了 NSCoder 接口——如果他们扩展了 NSObject,他们会这样做)。 NSObject 的 encodeWithCoderinitWithCoder 默认情况下什么都不做,所以除非你在你的类中实现你自己的代码,否则什么都不会被序列化。

如果你有 NSArray 或 NSDictionary 对象,你可以使用:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;

【讨论】:

name 是 NSString 类型的对象,所以要使用就保留,age 只是原始整数 除非 NSArray 中的对象是 NSString、NSData、NSArray 或 NSDictionary 类型,否则不能使用 writeToFile、writeToURL。如果您尝试在具有任何其他对象类型的 NSArray 上使用这些方法,它将始终返回 NO。 @Snickers 你是在说 NSArray 充满了其他对象类型,它们都实现了NSCoding 协议?因为这就是我上面解释的。否则,不确定,这是 3 年前的答案,东西可能已经改变,请发布你的答案,如果它是更好的解决方案,ppl 会投票。【参考方案2】:

您执行此操作的方式与在 Mac OS X 上执行此操作的方式相同:您的 POCO 必须符合 NSCoding 协议。有关概念参考,请参阅 here,有关 NSCoding 参考,请参阅 here。

如果数据不是那么疯狂,并且您的对象之间没有复杂得离谱的关系,那么将所有内容写成 plist 可能是您的最佳选择;它的执行速度非常快,并且在您的代码中实现起来很简单。就像你说的,CoreData 可能需要很多额外的工作来适应你的代码,而 sqlite 真的只适用于存储非常适合存储在关系数据库中的数据。请记住,sqlite 也比使用二进制 plist 更慢并且使用更多资源。

【讨论】:

【参考方案3】:

NSCoder 是用于序列化的标准 Cocoa 习惯用法。

【讨论】:

以上是关于如何序列化 iPhone sdk 中的简单对象?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK 4.0 中的滑动手势? [关闭]

iphone sdk CGAffineTransform 获取对象的旋转角度

在 iphone sdk 的屏幕上移动对象

如何从 iphone sdk 中的 ISOCountryCode 获取 ISOCurrencyCode?

如何从 iphone sdk 中的城市名称获取位置(坐标)?

如何使用 Iphone sdk 中的音频队列播放 .wav 文件