代码之家  ›  专栏  ›  技术社区  ›  Bluephlame

如何在iPhone sdk中序列化一个简单对象?

  •  27
  • Bluephlame  · 技术社区  · 17 年前

    我想我有三个选择。

    1. 核心数据。(3.0中的新功能)这将很有效;然而,我的数据模型需要改变才能实现这一点。这将是一次巨大的返工,我不确定是否值得付出努力。

    3 回复  |  直到 16 年前
        1
  •  14
  •   itsaboutcode    15 年前

    NSCoding

    // 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 默认情况下什么都不做,所以除非你在类中实现自己的代码,否则任何东西都不会被序列化。

    // Writing
    - (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
    - (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
    // Reading
    - (id)initWithContentsOfFile:(NSString *)aPath;
    - (id)initWithContentsOfURL:(NSURL *)aURL;
    
        2
  •  33
  •   stefanB    17 年前

    NSCoding 协议。看 here here

    sqlite确实只适合存储非常适合存储在关系数据库中的数据。请记住,sqlite也比使用二进制plist更慢,使用的资源更多。

        3
  •  0
  •   rpetrich    17 年前

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