如何序列化 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”];
NSArray
和 NSDictionary
已经实现了序列化方法。他们将序列化他们持有的所有对象(如果对象实现了 NSCoder 接口——如果他们扩展了 NSObject,他们会这样做)。 NSObject 的 encodeWithCoder
和 initWithCoder
默认情况下什么都不做,所以除非你在你的类中实现你自己的代码,否则什么都不会被序列化。
如果你有 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 CGAffineTransform 获取对象的旋转角度
如何从 iphone sdk 中的 ISOCountryCode 获取 ISOCurrencyCode?