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

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

我想我有 3 个选择。

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

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

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

【问题讨论】:

    标签: iphone cocoa cocoa-touch serialization cocoa-design-patterns


    【解决方案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 习惯用法。

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多