归档的概念和用法
概念:对象归档是指将对象写入文件保存在硬盘的文件内,当在次打开程序时,可以还原这些对象。
也可以称为对象序列化、对象持外化。
数据持久化的方式:
1> NSKeyedArchiver --- 对象归档
2> NSUserDefaults
NSUserDefaults 只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
NSUserDefaults 是个plist文件,建议只是简单快速地保存小型数据,正如其名 -用户的设置。
3> 属性列表化 (NSArray、NSDictionary保存文件)
4> SQLite 数据库、Core Data 数据库
归档的形式:
1> 对 Foundation 库中对象进行归档
2> 自定义对象进行归档 (需要实现归档协议、NSCoding)
归档后的文件是加密的、属性列表是明文的。
//
// main.m
// ArchiverDemo
#import <Foundation/Foundation.h>
int main(int argc,const char * argv[])
{
@autoreleasepool {
/**
* 第一种方式
* 实现一个数组的序列化和反序列化
* 一个序列化对象只能序列化一个对象到指定的文件中。
*/
// 序列化 数组归档
NSArray *array = @[@"abc",@"123",@123456];
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"archiveDemo.archive"];
BOOL sucess = [NSKeyedArchiverarchiveRootObject:array toFile:path];
if (sucess)
{
NSLog(@"archive sucess");
}
// 反序列化 解归档
NSArray *array1 = [NSKeyedUnarchiverunarchiveObjectWithFile:path];
NSLog(@"%@", array1);
}
return 0;
}
//
// main.m
// ArchiverDemo
#import <Foundation/Foundation.h>
int main(int argc,const char * argv[])
{
@autoreleasepool {
/**
* 第二种方式
* 一个基本数据类型和一个object-C对象类型,进行对象归档和解归档。
* 可以序列化多个对象
*/
// 序列化
NSString *homePath = NSHomeDirectory();// 获取当前路径
// 生成归档文件
NSString *filePath = [homePath stringByAppendingPathComponent:@"test.archive"];
// 创建 NSMutableData 对象
NSMutableData *data = [NSMutableDatadata];
// 创建归档对象
NSKeyedArchiver *archive = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];
// 归档数据
NSArray *array = @[@"jack",@"tom"];
[archiveencodeFloat:50forKey:@"weight"];
[archiveencodeObject:@"jack"forKey:@"name"];
[archiveencodeObject:array forKey:@"array"];
[archivefinishEncoding];
// 生成文件
[datawriteToFile:filePath atomically:YES];
// 反序列化
NSData *content = [NSDatadataWithContentsOfFile:filePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:content];
float weight = [unarchiver decodeFloatForKey:@"weight"];
NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSArray *array1 = [unarchiver decodeObjectForKey:@"array"];
NSLog(@"weith:%0.2f, name:%@, array1:%@", weight, name, array1);
}
return 0;
}