数据存储之归档和反归档

来源:互联网 发布:淘宝有哪些好看的鞋店 编辑:程序博客网 时间: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;
@end

2. 实现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];
}
@end

3. 将保存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);
}









  

0 0
原创粉丝点击