zoukankan      html  css  js  c++  java
  • 数据存储之归档

    - 归档 NSKeyedArchiver : 序列化,把对象转为字节码,存储到文件中,然后将文件存储到硬盘中,实现数据的持久化

    • 解归档 NSKeyedUnarchiver: 反序列化,把字节码转为对象
         
      注:
    1. 归档Foundation框架中的对象
    2. 归档自定义的对象,但是需要注意所归档的对象类必须遵守协议
    3. 归档之后的文件是加密的,安全性高

    归档的代码实现

    归档 (序列化)

    归档的内容
        NSArray *ary = @[@21, @"ios", @"apple", [NSDate date]];
        归档的文件的路,即要存入的路径
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSString *filePath = [documentPath stringByAppendingPathComponent:@"test.archiver"];
        NSLog(@"%@",filePath);
        归档
        BOOL res = [NSKeyedArchiver archiveRootObject:ary toFile:filePath];
        if (res) {
            NSLog(@"归档成功");
        }

    解归档 (反序列化)

    id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
        NSLog(@"解归档: %@", object);
    但是这种系统提供的归档方式太过死板,不够灵活,所以选择自定义归档方法

    自定义归档方法实现

    //归档文件的路径
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filePath = [documentPath stringByAppendingPathComponent:@"test.archiver"];

    归档

    1. 创建NSMutableData实例作为归档存储数据
        NSMutableData *data = [NSMutableData data];

    2. 创建归档的对象
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    3. 添加归档内容 (设置key、value值)
        [archiver encodeObject:@"apple" forKey:@"name"];
        [archiver encodeInt:21 forKey:@"age"];
        [archiver encodeObject:@[@"abc",@"123"] forKey:@"ary"];

    自定义的Student对象
    

    Student *stu = [[Student alloc] init];
        stu.name = @"jredu";
        stu.num = 1;
        [archiver encodeObject:stu forKey:@"stu"];

    4. 完成归档
        [archiver finishEncoding];
        5. 将归档的数据存储到磁盘中
        if ([data writeToFile:filePath atomically:YES]) {
            NSLog(@"归档完成");
        }

    解归档

    1. 从磁盘读取文件,生成NSData实例
        NSData *contentData = [NSData dataWithContentsOfFile:filePath];

    2. 根据NSData实例创建和初始化解归档的对象
        NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:contentData];

    3. 解归档,根据key值获取value值
        NSString *name = [unArchiver decodeObjectForKey:@"name"];
        int age = [unArchiver decodeIntForKey:@"age"];
        id ary = [unArchiver decodeObjectForKey:@"ary"];
        NSLog(@"%@  %i  %@",name, age, ary);
        
        Student *unArchiverStu = [unArchiver decodeObjectForKey:@"stu"];
        NSLog(@"name:%@  num:%i",unArchiverStu.name, unArchiverStu.num);

    对于自定义的对象的归档,需要注意所归档的对象类必须遵守协议

    #pragma mark - 编码:对对象的属性进行编码
    -(void)encodeWithCoder:(NSCoder *)aCoder{
    

    [aCoder encodeInt:_num forKey:@"num"];
        [aCoder encodeObject:_name forKey:@"name"];
    }

    #pragma mark - 解码:解码归档数据初始化对象
    -(id)initWithCoder:(NSCoder *)aDecoder{
    

    if (self = [super init]) {
            _num = [aDecoder decodeIntForKey:@"num"];
            _name = [[aDecoder decodeObjectForKey:@"name"] copy];
        }
        return self;
    }

  • 相关阅读:
    网络基础 HTTP协议之http url简介
    MySql 简单统计查询消耗时间脚本
    Java java jdk在Linux下安装与环境变量的配置
    MySql 正则表达式简介及使用
    MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
    MySql 定时任务的使用
    MySql 利用crontab实现MySql定时任务
    MySql 利用mysql&mysqldum导入导出数据
    排错-windows平台下访问oracle em出现空白的解决方法
    Oracle 修改oracle数据库名
  • 原文地址:https://www.cnblogs.com/gzoof/p/5650107.html
Copyright © 2011-2022 走看看