数据存储之归档和反归档
来源:互联网 发布:淘宝有哪些好看的鞋店 编辑:程序博客网 时间:2024/04/27 18:13
1. 归档和反归档的概念
归档和反归档就是将对象以文件的形式保存起来,使用的时候读取该文件的路径就能获得对象。
2. 对象归档和NSUserDefault(偏好设置) ,plist文件存储的比较
NSUserDefault(偏好设置)是将所有的Value 存储在沙河中Library/Preferences 里,文件格式是plist.偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要在偏好设置中保存其他数据,比如,保存用户名、字体大小、是否自动登录等。
Plist 文件存储是将Value 存储到沙河里,需要指定文件所在位置, 文件格式是plist. 在开发过程中,有时候需要把程序的一些配置保存下来,或者游戏数据等等。 这时候需要写入Plist数据。写入的plist文件会生成在对应程序的沙盒目录里。用途比较广泛。
对象归档和反归档 是面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 序列化的结果就是二进制的data数据,好处是可以直接存取对象,更快。
3. 归档和反归档的使用
步骤一 凡是需要进行归档和反归档的对象都需要遵守NSCoding协议以进行对象的编码和解码
1.1 OC的常见数据类型NSArray ,NSDictionary, NSNumber ,NSString都遵守了NSCoding协议,因此可以直接进行归档和反归档
1.2 OC自定义的对象需要手动遵守NSCoding协议,才能进行归档和反归档。
1.3 遵守NSCoding协议,需要实现两个方法
归档: - (void)encodeWithCoder:(NSCoder *)aCoder 将对象需要归档的属性进行编码
反归档:- (id)initWithCoder:(NSCoder *)aDecoder 解码成属性
步骤二 序列化和反序列化
使用NSKeyedArchieve 和NSKeyedUnArchieve 进行序列化和反序列化
序列化:NSMutableData *dataM = [NSMutableData data]; // 创建一个可变二进制数据容器
NSKeyedArchiver *archieve = [[NSKeyedArchiver alloc]initForWritingWithMutableData:dataM]; // 创建相应的序列化对象
[archieve encodeObject:array forKey:@"array"]; // 将对象进行序列化
[archieve finishEncoding]; // 结束序列化
反序列化:NSData *data = [NSData dataWithContentsOfFile:[self filePathWithFileName:fileName]]; // 去得二进制文件
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data]; // 创建相应的反序列化对象工具
NSArray *array = [NSArray array]; // 初始化数组以盛放反序列化后的对象数组
array = [unarchiver decodeObjectForKey:@"array"]; // 反序列化后得到的对象数组
[unarchiver finishDecoding]; // 结束反序列化
4. 示例代码
1. 自定义Person类 遵守NSCoding 协议 Person.h文件
@interface Person : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSDictionary *info;
@end2. 实现NSCoding协议 Person.m文件
#define kName @"name"
#define kAge @"age"
#define kInfo @"info"
@implementation Person
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:kName];
self.age = [aDecoder decodeIntForKey:kAge];
self.info = [aDecoder decodeObjectForKey:kInfo];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:kName];
[aCoder encodeInt:self.age forKey:kAge];
[aCoder encodeObject:self.info forKey:kInfo];
}
@end3. 将保存Person的数组对象序列化后保存到Library/Caches文件目录下 controller 文件
/** 获取Library/Caches目录下文件名 */
- (NSString *)filePathWithFileName:(NSString *)fileName{
NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
return [cacheDirectory stringByAppendingPathComponent:fileName];
}
/** 序列化并保存 */
- (void)writeWithFileName:(NSString *)fileName{
Person *person = [[Person alloc]init];
person.name = @"John";
person.age = 18;
person.info = @{@"xx":@"xx"};
NSNumber *age = [NSNumber numberWithInt:person.age];
NSArray *array = @[person,person,person,person.name,age,person.info]; // 注意数组里面包括一个int 类型和一个字符串类型 和自定义的Person类
NSMutableData *dataM = [NSMutableData data];
NSKeyedArchiver *archieve = [[NSKeyedArchiver alloc]initForWritingWithMutableData:dataM];
[archieve encodeObject:array forKey:@"array"];
[archieve finishEncoding];
NSString *filePath = [self filePathWithFileName:fileName];
[dataM writeToFile:filePath atomically:YES];
}
4. 读取数据
- (void)readWithFileName:(NSString *)fileName{
NSData *data = [NSData dataWithContentsOfFile:[self filePathWithFileName:fileName]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
NSArray *array = [NSArray array];
array = [unarchiver decodeObjectForKey:@"array"];
[unarchiver finishDecoding];
Person *person = [array lastObject];
NSLog(@"person = %@",person);
}
- 数据存储之归档和反归档
- 数据存储之(四): 归档、反归档
- 归档和反归档
- 数据存储之归档
- iOS基础——数据存储之沙盒机制、Plist、Perference、归档、反归档
- runtime之归档反归档
- 【iOS开发-存储】使用NSCoding归档和反归档
- iOS数据存储之---归档
- ios数据存储之归档
- IOS之数据持久化(归档与反归档)
- iOS之数据持久化 - 归档与反归档
- 随波逐流之IOS 复杂数据的归档和反归档 详解
- NSUserDefaults 与 数据的归档和反归档
- iOS中的数据持久化,归档和反归档
- iOS数据持久化,写入,归档和反归档
- iOS开发之归档(NSKeyedArchiver)和反归档(NSKeyedUnarchiver)
- 数据持久化,归档,反归档
- iPhone数据存储之属性和归档Archive
- js如何将CSS格式化和压缩
- 【华为OJ】公共字符串计算
- 总经理该如何平衡职能部门经理与项目经理的人事权力?
- The specified JRE installation does not exist
- C++语法:析构函数
- 数据存储之归档和反归档
- CSS3和js炫酷点击按钮3D翻转动画特效
- IO (3) 文件监控器。
- OpenGL绘线方式 GL_LINES与GL_LINE_STRIP的区别
- 老祖宗的智慧:"十不过",字字珠玑!
- 《Head First 设计模式》之适配器模式
- c++类的实例化,有没有new的区别
- android:滑动侧边栏
- 身为管理者,如何让下属心甘情愿地跟着你?