前言

  • 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。
  • 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。
  • 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。
  • 前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
  • 缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。
  • 所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
  • iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。
  • 在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。

1、系统类的归档/反归档

// 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/stringAchiverFile"]; // 待归档的数据
NSString *string = @"bei jing huan yin nin"; // 归档,归档到文件
bool bl = [NSKeyedArchiver archiveRootObject:string toFile:achiverPath]; // 反归档,从文件反归档
NSString *strFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];

2、自定义类的归档和反归档

  • 2.1 Dog.h

    // 遵守 NSCoding 协议
    @interface Dog : NSObject <NSCoding> @property (nonatomic, assign)int age;
    @property (nonatomic, copy)NSString *name; + (Dog *)dogWithName:(NSString *)name andAge:(int)age; @end
  • 2.2 Dog.m

    // 实现 NSCoding 协议方法
    @implementation Dog // 归档 方法,使用编码器将对象编码成二进制数据流,归档(持久化存储)
    - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeInt:self.age forKey:@"age"];
    [aCoder encodeObject:self.name forKey:@"name"];
    } // 反归档 方法,将保存在磁盘上的二进制数据流,解码成 OC 对象
    - (id)initWithCoder:(NSCoder *)aDecoder{ self.age = [aDecoder decodeIntForKey:@"age"];
    self.name = [aDecoder decodeObjectForKey:@"name"]; return self;
    } @end
  • 2.3 main.m

    #import "Dog.h"
    
    // 文件路径
    NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dogAchiverFile"]; Dog *dog = [Dog dogWithName:@"xiao hei" andAge:5]; // 归档 // 归档到文件
    BOOL bl = [NSKeyedArchiver archiveRootObject:dog toFile:achiverPath]; // 反归档 // 从文件反归档
    Dog *dogFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];

3、NSKeyedArchiver 序列化

  • 3.1 main.m

    // Cat 类不需要遵守 NSCoding 协议,也不需要其协议方法
    #import “Cat.h” // 文件路径
    NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/catAchiverFile"]; // 归档,编码 Cat *cat1 = [Cat catWithName:@"xiao bai" andAge:2]; // 设置数据区域
    NSMutableData *achiverDataArea = [NSMutableData data]; // 开始存储对象,编码 // 将数据区域链接到 NSKeyedArchiver 对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:achiverDataArea]; // 可以存储类的实例变量
    [archiver encodeObject:cat1.name forKey:@"name"]; // 编码完成
    [archiver finishEncoding]; // 将存档的数据写入文件
    BOOL bl = [achiverDataArea writeToFile:achiverPath atomically:YES]; // 反归档,解码 Cat *cat2 = [[Cat alloc] init]; // 设置数据区域
    NSData *unarchiverDataArea = [NSData dataWithContentsOfFile:achiverPath]; // 解码存储在归档文件中的对象 // 将数据区域链接到 NSKeyedUnarchiver 对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverDataArea]; // 解码
    cat2.name = [unarchiver decodeObjectForKey:@"name"]; // 解码完成
    [unarchiver finishDecoding];

NSKeyedArchiver数据归档的更多相关文章

  1. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  2. iOS - Swift NSKeyedArchiver 数据归档

    前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...

  3. IOS NSKeyedArchiver(归档存取数据)

    如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...

  4. iOS开发 - 数据归档与恢复 NSKeyedArchiver

    归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...

  5. DBA日常管理——数据归档(Archiving-Data)

    原文出处:http://www.sqlnotes.cn/post/2013/09/05/DBA-Daily-Jobs-One%E2%80%94%E2%80%94-Archiving-Data 均为本人 ...

  6. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  7. SQL Server数据归档的解决方案

    SQL Server数据归档的解决方案   最近新接到的一项工作是把SQL Server中保存了四五年的陈年数据(合同,付款,报销等等单据)进行归档,原因是每天的数据增量很大,而历史数据又不经常使用, ...

  8. oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用

    oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错.误删恢复之外,较少被用于产生更有价值的用途. 各种闪回表flashback ...

  9. pt-archiver数据归档

    可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...

随机推荐

  1. zabbix的sendEmail配置

    zabbix的sendEmail配置 [root@hongquan scripts]# yum install sendmail[root@hongquan soft]# tar xvzf sendE ...

  2. mybatis foreach标签的解释 与常用之处

    情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...

  3. log4net 使用总结- (2)在ASP.NET MVC 中使用

    log4net在ASP.NET MVC中的配置,还有一种配置方式,即不在web.config中,而是单独新建一个log4net.config 在根目录下   第一.引用log4net.dll   第二 ...

  4. 使用Easy-creds创建伪AP

    项目地址:https://github.com/brav0hax/easy-creds 打开文件夹 安装easy-creds root@sch01ar:/sch01ar/easy-creds# ./i ...

  5. pandas层级索引1

    层级索引(hierarchical indexing) 下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引. ...

  6. IOS证书申请 PPF provisioning profile Developer Certificate

    [Error] No provisioning profile found for the selected build configuration 新来一个iPhone,真机调试的时候报错. 1.x ...

  7. BurpSuite系列(九)----Comparer模块(比较器)

    一.简介 Burp Comparer在Burp Suite中主要提供一个可视化的差异比对功能,来对比分析两次数据之间的区别.使用中的场景可能是: 1.枚举用户名过程中,对比分析登陆成功和失败时,服务器 ...

  8. angularJS笔记之 服务

    angular的服务有五种 第一种 constant 一般作为一种常量的服务 不可更改 第二种 value 用来注册服务对象或函数 可更改 第三种 factory 创建和配置服务的最快捷方式.可更改 ...

  9. Hadoop Serialization -- hadoop序列化详解 (2)

    回顾: 回顾序列化,其实原书的结构很清晰,我截图给出书中的章节结构: 序列化最主要的,最底层的是实现writable接口,wiritable规定读和写的游戏规则 (void write(DataOut ...

  10. python动态爬取网页

    简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...