27

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

我想我有3个选择。

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

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

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

4

3 回答 3

32

要序列化自定义对象,您只需要符合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,他们就会这样做)。NSObjectencodeWithCoder并且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;
于 2009-05-18T03:37:55.377 回答
14

您可以像在 Mac OS X 上一样执行此操作:您的 POCO 必须符合NSCoding协议。有关概念参考,请参见此处,有关 NSCoding 参考,请参见此处。

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

于 2009-05-18T02:44:40.433 回答
0

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

于 2009-05-18T02:47:12.750 回答