iOS数据持久化存储-NSKeyedArchiver

归档文件

归档(称为序列化)是把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。归档解归档用于少量数据的持久化存储和读取。

归档和解归档常用API

//NSKeyedArchiver  API
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;

- (instancetype)initForWritingWithMutableData:(NSMutableData *)data;

- (void)finishEncoding;

- (void)encodeObject:(nullable id)objv forKey:(NSString *)key;
- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key;
- (void)encodeInt:(int)intv forKey:(NSString *)key;
- (void)encodeFloat:(float)realv forKey:(NSString *)key;
- (void)encodeDouble:(double)realv forKey:(NSString *)key;
//NSKeyedUnarchiver   API
+ (nullable id)unarchiveObjectWithData:(NSData *)data;
+ (nullable id)unarchiveObjectWithFile:(NSString *)path;

- (instancetype)initForReadingWithData:(NSData *)data;

- (void)finishDecoding;

- (nullable id)decodeObjectForKey:(NSString *)key;
- (BOOL)decodeBoolForKey:(NSString *)key;
- (int)decodeIntForKey:(NSString *)key;
- (float)decodeFloatForKey:(NSString *)key;
- (double)decodeDoubleForKey:(NSString *)key;

归档的方式:

  • 针对对象进行归档(NSArray,NSDictionary等)
  • 对自定义的内容进行归档
  • 对自定义的对象进行归档
1、针对对象进行归档
- (void)objArchiver {
    
    //归档(序列化)
    NSArray *archiverAry = @[
                             @{@"Eugene" : @"ZhangYanJin"},
                             @{@"Chana" : @"LiChang"}
                             ];
    NSString *filePath = [self filePathWithName:@"Object"];
    if ([NSKeyedArchiver archiveRootObject:archiverAry toFile:filePath]) {
        NSLog(@"\n\n\n归档成功:路径%@",filePath);
    }
    
    //解归档 (反序列化)
    NSArray *unArchiverAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"\n解归档成功 %@",unArchiverAry);
    
    /**
     总结:
     *优点:归档和解归档操作步骤简单方便
     *缺点:一次只能归档一个对象,如果归档多个对象,需要分开麻烦,操作繁琐费时
     */
}
- (void)customContentArchiver {
    
    //归档
    //1、使用Data存放归档数据
    NSMutableData *archiverData = [NSMutableData data];
    
    //2、根据Data实例创建和初始化归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
    
    //3、添加归档内容(设置键值对)
    [archiver encodeObject:@"Eugene" forKey:@"name"];
    [archiver encodeObject:@"man" forKey:@"sex"];
    [archiver encodeInt:25 forKey:@"age"];
    [archiver encodeObject:@[@"OC",@"Swift",@"Html"] forKey:@"laguage"];
    [archiver encodeObject:@{@"favorite" : @"cook"} forKey:@"life"];
    [archiver encodeCGPoint:CGPointMake(1.0, 2.0) forKey:@"point"];
    
    //4、完成归档
    [archiver finishEncoding];
    
    //5、将归档的信息存储到磁盘上
    NSString *filePath = [self filePathWithName:@"CustomContent"];
    if ([archiverData writeToFile:filePath atomically:YES]) {
        NSLog(@"\n\n\n归档成功:路径%@",filePath);
    }
    
    //解归档
    //1、从磁盘读取文件,生成NSData实例
    NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];

    //2、根据Data实例创建和初始化解归档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];

    //3、解归档,根据key值访问
    NSString *name = [unarchiver decodeObjectForKey:@"name"];
    NSDictionary *life = [unarchiver decodeObjectForKey:@"life"];
    NSLog(@"\n解归档成功: %@ %@",name,life);
    
    //4、完成解归档
    [unarchiver finishDecoding];

    /**
     总结:
     *优点:可以同时归档多个对象、以及不同类型的对象(如:Int、CGFloat、CGPoint)
     *缺点:这里的对象都是基本类型数据,如果我想对自己定义类生成的实例对象进行归档,这样做将使操作又变得繁琐费时了
     */
}
- (void)customObjectArchiver {
    
    //序列化和反序列化遵循NSCoding协议的自定义类
    
    //归档
    Person *person = [[Person alloc] init];
    person.name = @"Eugene";
    person.sex = @"man";
    person.age = 25;
    person.height = 175;
    
    NSString *filePath = [self filePathWithName:@"CustomObject"];

    if ([NSKeyedArchiver archiveRootObject:person toFile:filePath]) {
        NSLog(@"\n\n\n归档成功:路径%@",filePath);
    }
    
    //解归档
    Person *unArchiverObj = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"\n解归档成功: %@ %@",unArchiverObj,unArchiverObj.name);
    
}
- (NSString *)filePathWithName:(NSString *)name {

    name = [[NSString alloc] initWithFormat:@"%@.archiver",name];
    
    //归档后的文件是加密的,所以归档文件的扩展名可以随意取,我这里后缀用archiver
    return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:name];
}

注意:

  • 1、默认情况下,只能对NSDate, NSNumber, NSString, NSArray, or NSDictionary来进行归档。
  • 2、若对自定义的对象进行归档,需要实现NSCoding协议,并实现NSCoding方法。
  • NSCoding协议的方法:
  • - (void)encodeWithCoder:(NSCoder *)aCoder;
  • - (instancetype)initWithCoder:(NSCoder *)aDecoder;
  • 3、如果用了继承,则子类一定要重写NSCoding协议的两个方法。

附:归档Demo

写在最后

推荐:
一个简单、线程安全的基于 key-value 的缓存框架EGOCache

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 2,655评论 2 10
  • 在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代...
    帅不过oneS阅读 607评论 0 1
  • 数据持久化的相关知识 四种将数据持久化存储到iOS文件系统的机制: plist 对象归档 iOS的嵌入式关系数据库...
    melouverrr阅读 626评论 0 0
  • 一、数据持久化概述 数据持久化就是数据的永久存储。其本质是将数据保存为文件,存到程序的沙盒中。 1、数据持久化的方...
    lilinjianshu阅读 489评论 0 1
  • 在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代...
    sindri的小巢阅读 16,831评论 13 85