一、简介
归档
当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流 NSData
类型数据,再通过写入文件来进行存储。
反归档
字节流转换为字典,数组,自定义的类等。
缺点
归档保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
使用场景
- 有些应用支持一个离线缓存,也就是说当手机没联网时,可以将手机有网时的数据存放在本地,当手机没网时,从本地中取出来这些数据展示。
- 电商场景中,可以缓存用户搜索历史记录。
二、使用
1.系统对象进行归档
//已字典为例
NSDictionary *dict=@{@"name":@"xiaoBai",@"age":@"25",@"sex":@"man"};
//归档
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *dataPath = [docPath stringByAppendingPathComponent:[NSString stringWithFormat:@"data.plist"]];
NSError *error;
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:dict requiringSecureCoding:NO error:&error];
[data writeToFile:dataPath atomically:YES];
//解档
NSData* unData = [NSData dataWithContentsOfFile:dataPath];
NSDictionary *unDict = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] fromData:unData error:&error];
NSLog(@"%@",unDict);
2.自定义对象
归档自定义对象该对象必须实现 NSCoding
和 NSSecureCoding
协议,并重写以下几、个方法:
-(void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)coder;
+ (BOOL)supportsSecureCoding;//返回yes
示例代码:
#import <Foundation/Foundation.h>
@interface DJModel : NSObject
@property (nonatomic, copy) NSString *name;
@end
#import "DJModel.h"
@interface DJModel ()<NSCoding,NSSecureCoding>
@end
@implementation DJModel
/**
当将一个自定义对象保存到文件的时候就会调用该方法
*/
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
}
/**
当从文件中读取一个对象的时候就会调用该方法
*/
- (id)initWithCoder:(NSCoder *)coder {
if(self = [super init]) {
_name = [coder decodeObjectForKey:@"name"];
}
return self;
}
/**
声明了它可以处理本身实例的编码解码方式,以防止替换攻击
*/
+ (BOOL)supportsSecureCoding {
return YES;
}
@end
归档解档:
DJModel *model = [[DJModel alloc]init];
model.name = @"dj";
//归档
NSString *modelPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:[NSString stringWithFormat:@"model.data"]];
NSError *error;
NSData* modelData = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:NO error:&error];
[modelData writeToFile:modelPath atomically:YES];
//解档
NSData* unModelData = [NSData dataWithContentsOfFile:modelPath];
DJModel *unModel = (DJModel *)[NSKeyedUnarchiver unarchivedObjectOfClass:[DJModel class] fromData:unModelData error:&error];