数据存储之归档

  • 归档 NSKeyedArchiver : 序列化,把对象转为字节码,存储到文件中,然后将文件存储到硬盘中,实现数据的持久化

  • 解归档 NSKeyedUnarchiver: 反序列化,把字节码转为对象

注:

1. 归档Foundation框架中的对象
2. 归档自定义的对象,但是需要注意所归档的对象类必须遵守<NSCoding>协议
3. 归档之后的文件是加密的,安全性高

归档的代码实现

归档 (序列化)
归档的内容
NSArray *ary = @[@21, @"ios", @"apple", [NSDate date]];
归档的文件的路,即要存入的路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"test.archiver"];
NSLog(@"%@",filePath);
归档
BOOL res = [NSKeyedArchiver archiveRootObject:ary toFile:filePath];
if (res) {
    NSLog(@"归档成功");
}
解归档 (反序列化)
id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"解归档: %@", object);

但是这种系统提供的归档方式太过死板,不够灵活,所以选择自定义归档方法

自定义归档方法实现

//归档文件的路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"test.archiver"];
归档
1. 创建NSMutableData实例作为归档存储数据
NSMutableData *data = [NSMutableData data];

2. 创建归档的对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

3. 添加归档内容 (设置key、value值)
[archiver encodeObject:@"apple" forKey:@"name"];
[archiver encodeInt:21 forKey:@"age"];
[archiver encodeObject:@[@"abc",@"123"] forKey:@"ary"];

自定义的Student对象
Student *stu = [[Student alloc] init];
stu.name = @"jredu";
stu.num = 1;
[archiver encodeObject:stu forKey:@"stu"];

4. 完成归档
[archiver finishEncoding];
5. 将归档的数据存储到磁盘中
if ([data writeToFile:filePath atomically:YES]) {
    NSLog(@"归档完成");
}
解归档
1. 从磁盘读取文件,生成NSData实例
NSData *contentData = [NSData dataWithContentsOfFile:filePath];

2. 根据NSData实例创建和初始化解归档的对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:contentData];

3. 解归档,根据key值获取value值
NSString *name = [unArchiver decodeObjectForKey:@"name"];
int age = [unArchiver decodeIntForKey:@"age"];
id ary = [unArchiver decodeObjectForKey:@"ary"];
NSLog(@"%@  %i  %@",name, age, ary);

Student *unArchiverStu = [unArchiver decodeObjectForKey:@"stu"];
NSLog(@"name:%@  num:%i",unArchiverStu.name, unArchiverStu.num);

对于自定义的对象的归档,需要注意所归档的对象类必须遵守<NSCoding>协议

#pragma mark - 编码:对对象的属性进行编码
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInt:_num forKey:@"num"];
[aCoder encodeObject:_name forKey:@"name"];
}

#pragma mark - 解码:解码归档数据初始化对象
-(id)initWithCoder:(NSCoder *)aDecoder{

if (self = [super init]) {
    _num = [aDecoder decodeIntForKey:@"num"];
    _name = [[aDecoder decodeObjectForKey:@"name"] copy];
}
return self;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在上一篇的文章中我简单介绍了使用偏好设置和属性列表进行数据存储iOS数据存储之偏好设置和属性列表,今天总结下数据存...
    若小北00阅读 9,580评论 3 25
  • 在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态。在iOS和OS...
    pro648阅读 14,005评论 1 27
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,232评论 25 709
  • 最近,我做了一个梦。 梦见小时候的自己, 在一点一点地解开系在身上的绳索。 她说,你终于来了。 晚安。 答应我,做...
    送你一颗白菜阅读 182评论 4 1
  • 说到取网名我们都不会陌生,最初的论坛、QQ、游戏名,后来的微博、微信现在的公众号、自媒体,都需要一个好名字,说起来...
    三脚猫QAQ阅读 6,050评论 0 2

友情链接更多精彩内容