NSKeyedArchiver数据归档
前言
- 在 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数据归档的更多相关文章
- iOS - OC NSKeyedArchiver 数据归档
前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...
- iOS - Swift NSKeyedArchiver 数据归档
前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...
- IOS NSKeyedArchiver(归档存取数据)
如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...
- iOS开发 - 数据归档与恢复 NSKeyedArchiver
归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...
- DBA日常管理——数据归档(Archiving-Data)
原文出处:http://www.sqlnotes.cn/post/2013/09/05/DBA-Daily-Jobs-One%E2%80%94%E2%80%94-Archiving-Data 均为本人 ...
- oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复
我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...
- SQL Server数据归档的解决方案
SQL Server数据归档的解决方案 最近新接到的一项工作是把SQL Server中保存了四五年的陈年数据(合同,付款,报销等等单据)进行归档,原因是每天的数据增量很大,而历史数据又不经常使用, ...
- oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用
oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错.误删恢复之外,较少被用于产生更有价值的用途. 各种闪回表flashback ...
- pt-archiver数据归档
可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...
随机推荐
- 航图转换相关sql
--旧库列举所有类型航图 select distinct c.identifier airport_icao,d.sc_code chart_type,s.namefrom special_char ...
- 前端学习---html基础知识
HTML基本知识 学习html首先我们先看看HTML本质: web框架本质 我们在学socket,我们创建一个socketserver,然后运行起来,有一个client客户端要连接socket服务端, ...
- .net 连接ORACLE中文显示乱码解决方案
FYI由于历史的原因,早期的oracle没有中文字符集(如oracle6.oracle7.oracle7.1),但有的用户从那时起就使用数据库了, 并用US7ASCII字符集存储了中文,或是有的用户在 ...
- java 高并发解决方案
对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研 ...
- [原创]Java项目统一UTC时间方案
Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考 ...
- 各大IT/IC公司offer比较
1:本人西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献给各位学弟学妹,公司比较全,你想去的公司不在这里面,基本上是无名小公司了:但无名小公司有时也 ...
- BigDecimal与double
前几天,系统处理double类型的加减法,出现问题. 请看题: 示例1 问, 结果是多少? 0.01? No! 结果是0.009999999999999998! 为什么会这样呢? 因为float和do ...
- Eclipse oxygen安装中文包
help->install new software Eclipse software repository http://download.eclipse.org/technology/ba ...
- Linux 常用命令(转)
转自:https://www.cnblogs.com/gaojun/p/3359355.html 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文 ...
- opennebula 安装指定参数
[root@opennebula opennebula-]# ./install.sh -u oneadmin -g oneadmin -k -d /home/oneadmin/ -u 指定用户-g ...