zoukankan      html  css  js  c++  java
  • Archive将多个对象归档到同一个文件

    使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里。但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象。



    NSData能够为一些数据提供暂时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。

    能够使用[NSMutableData data]创建可变数据空间。


    相关的原理图(截图引用):


     //归档(编码)
        // 新建一块可变数据区
        NSMutableData *data = [NSMutableData data];
        // 将数据区连接到一个NSKeyedArchiver对象
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        // 開始存档对象,存档的数据都会存储到NSMutableData中
        [archiver encodeObject:person1 forKey:@"person1"];
        [archiver encodeObject:person2 forKey:@"person2"];
        // 存档完成(一定要调用这种方法)
        [archiver finishEncoding];
        // 将存档的数据写入文件
        [data writeToFile:path atomically:YES];
        
        //恢复(解码)
        // 从文件里读取数据
        NSData *data = [NSData dataWithContentsOfFile:path];
        // 依据数据。解析成一个NSKeyedUnarchiver对象
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
        Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
        // 恢复完成
        [unarchiver finishDecoding];
    这样就实现了多个对象的归档。相同那些对应的person对象也是须要和前面所讲的那样进行归档的设置。


    从上面所用的person类来进行深拷贝:

    <span style="color:#000000;">- (void)viewDidLoad {
        [super viewDidLoad];
        
        Person* person1 = [[Person alloc]init];
        
        // 暂时存储person1的数据
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
        // 解析data,生成一个新的Person对象
        Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        // 分别打印内存地址
        NSLog(@"person1:%p", person1);
        NSLog(@"person2:%p", person2);
    }
    
    结果显示:
    2015-08-19 15:42:46.797 ArchiveKey[2593:194031] person1:0x7fc021c33000
    2015-08-19 15:42:46.798 ArchiveKey[2593:194031] person2:0x7fc021c2f140
    能够看到两个地址不同样的。
    </span>


  • 相关阅读:
    流畅的python,Fluent Python 第四章笔记
    Python中的eval()、exec()及其相关函数(转)
    给自己与初学者关于decode,encode的建议(啥utf-8,GBK)。
    流畅的python,Fluent Python 第三章笔记
    流畅的python,Fluent Python 第二章笔记
    python数组array.array(转帖)
    流畅的python,Fluent Python 第一章笔记
    流畅的Python第五章,一等函数笔记
    python中的__slots__使用极其定义(转)
    load
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7284554.html
Copyright © 2011-2022 走看看