NSKeyedArchiver数据归档
原创
©著作权归作者所有:来自51CTO博客作者wx6103b5205e184的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
- 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。
- 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。
- 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。
- 前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
- 缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。
- 所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
- iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。
- 在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。
1、系统类的归档/反归档
// 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/stringAchiverFile"];
// 待归档的数据
NSString *string = @"bei jing huan yin nin";
// 归档,归档到文件
bool bl = [NSKeyedArchiver archiveRootObject:string toFile:achiverPath];
// 反归档,从文件反归档
NSString *strFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];
2、自定义类的归档和反归档
-
2.1 Dog.h
// 遵守 NSCoding 协议
@interface Dog : NSObject <NSCoding>
@property (nonatomic, assign)int age;
@property (nonatomic, copy)NSString *name;
+ (Dog *)dogWithName:(NSString *)name andAge:(int)age;
@end
-
2.2 Dog.m
// 实现 NSCoding 协议方法
@implementation Dog
// 归档 方法,使用编码器将对象编码成二进制数据流,归档(持久化存储)
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInt:self.age forKey:@"age"];
[aCoder encodeObject:self.name forKey:@"name"];
}
// 反归档 方法,将保存在磁盘上的二进制数据流,解码成 OC 对象
- (id)initWithCoder:(NSCoder *)aDecoder{
self.age = [aDecoder decodeIntForKey:@"age"];
self.name = [aDecoder decodeObjectForKey:@"name"];
return self;
}
@end
-
2.3 main.m
#import "Dog.h"
// 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dogAchiverFile"];
Dog *dog = [Dog dogWithName:@"xiao hei" andAge:5];
// 归档
// 归档到文件
BOOL bl = [NSKeyedArchiver archiveRootObject:dog toFile:achiverPath];
// 反归档
// 从文件反归档
Dog *dogFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];
3、NSKeyedArchiver 序列化