Archive将多个对象归档到同一个文件

使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中。但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象。


NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。

可以使用[NSMutableData data]创建可变数据空间。


相关的原理图(截图引用):


 //归档(编码)
    // 新建一块可变数据区
    NSMutableData *data = [NSMutableData data];
    // 将数据区连接到一个NSKeyedArchiver对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    // 开始存档对象,存档的数据都会存储到NSMutableData中
    [archiver encodeObject:person1 forKey:@"person1"];
    [archiver encodeObject:person2 forKey:@"person2"];
    // 存档完毕(一定要调用这个方法)
    [archiver finishEncoding];
    // 将存档的数据写入文件
    [data writeToFile:path atomically:YES];
    
    //恢复(解码)
    // 从文件中读取数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 根据数据,解析成一个NSKeyedUnarchiver对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
    Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
    // 恢复完毕
    [unarchiver finishDecoding];
这样就实现了多个对象的归档。 同样那些相应的person对象也是需要和前面所讲的那样进行归档的设置。


从上面所用的person类来进行深拷贝:

<span style="color:#000000;">- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person* person1 = [[Person alloc]init];
    
    // 临时存储person1的数据
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
    // 解析data,生成一个新的Person对象
    Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    // 分别打印内存地址
    NSLog(@"person1:%p", person1);
    NSLog(@"person2:%p", person2);
}

结果显示:
2015-08-19 15:42:46.797 ArchiveKey[2593:194031] person1:0x7fc021c33000
2015-08-19 15:42:46.798 ArchiveKey[2593:194031] person2:0x7fc021c2f140
可以看到两个地址不相同的。
</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
源码ANKeyValue,讨论NSUserDefault优化的必要性和实现前,我们可以先回顾下客户端相关的数据存储/持久化。首先笔者想谈得还是数据库,数据库已不是什么先锋技术,但是依然是众多解决方案中开发成本较高的方案,毕竟,在业内的开发实践,也只有数据库会需要独立一类工种——“DB工程师”来支持相关的开发工作。其次是文件,作为Unix like最为重要的技术理念之一,经典、简单而不失强大,文件之于编程,如筷子之于餐桌。iOS上面,我们又开始接触到了更多的解决方案,如著名的CoreData,概念上还是数据库,与常规数据库相比,最大的特点是面向对象,用面向对象的思维去完成数据库的建设和运用,同时支持建表的可视化编辑。然而,相比较于数据库,实现起来也仅能说简化了一点,甚至使用数据库比如SQLite熟悉后,CoreData开发就不见得就比数据库高效,由于高度框架化不免带来性能上的妥协(部分数据场景)。Archive归档需要先有对象对自身序列化的支持(即把元数据转换为字节流),进而以文件的形式进行存储,归档的优势在于隐去对象整体到数据转化细节,便于对程序当前状态的保存和恢复。 NSUserDefault,这是iOS中用于存储用户的行为以及程序的状态而使用的基于Key-Value(Object)的存储方式。开发者可以像操作Map/Dictionary之类的容器那样去操作待存储的信息,再由NSUserDefault在恰当的时机进行归档/写入操作,这是一种相当实用且广受欢迎的方式。然而,NSUserDefault并不完美: 第一,NSUserDefault的所有数据是在一张table或者说一个文件上,这使得表现受到很大的限制,我们不太可能用它来存取太大的对象/结构,比如整个对象list,否则会有性能问题; 第二,同1相同的理由,对NSUserDefault我们不能过于频繁地触发文件同步写入的操作,这又为数据的及时更新和同步留下隐患; 第三,NSUserDefault也没有针对大size的数据块专门优化,从NSUserDefault的命名可以看出,就是用于配置项和状态保存使用; 第四,NSUserDefault不支持数据加密和版本升级管理;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值