【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
简介
归档(Archive)也称为序列化(serialization),把对象转化为字节码,以文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundation和Cocoa Touch类都可以),将文档上的字节码转化为对象的过程叫做解档(unarchive)也叫反序列化(unserialization)
归档的数据类型要求; NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary五种类型,如果不能归档,我们可以尝试转化为这五种中的任何一种再进行存储
单个对象归档解档
//获取归档文件路径
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *filePath = [documentPath stringByAppendingPathComponent:@"test"];//对字符串@”test”进行归档,写入到filePath中
[NSKeyedArchiver archiveRootObject:@"test" toFile:filePath];//根据保存数据的路径filePath解档数据
NSString *result = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
//log结构为@”test”,就是上面归档的数据
NSLog(@"%@",result);
归档基本数据或基本对象, 框架内定义的(或者已经遵守NSCoding协议的自定义类)中的单个对象进行归档解档(一次只能归档一个,多个需要分开多次归档)
多个对象归档解档
//获取归档路径NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;NSString *filePath = [documentPath stringByAppendingPathComponent:@"test"];//用来承载数据的NSMutableDataNSMutableData *data = [[NSMutableData alloc] init];//归档对象NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];//将要被保存的三个数据NSString *name = @"jack";int age = 17;double height = 1.78;//运用encodeObject:方法归档数据[archiver encodeObject:name forKey:@"name"];[archiver encodeInt:age forKey:@"age"];[archiver encodeDouble:height forKey:@"height"];//结束归档[archiver finishEncoding];//写入数据(存储数据)[data writeToFile:filePath atomically:YES];//NSMutableData用来承载解档出来的数据NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:filePath];//解档对象NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];//分别解档出三个数据NSString *resultName = [unArchiver decodeObjectForKey:@"name"];int resultAge = [unArchiver decodeIntForKey:@"age"];double resultHeight = [unArchiver decodeDoubleForKey:@"height"];//结束解档[unArchiver finishDecoding];//成功打印出结果,说明成功归档解档NSLog(@"name = %@, age = %d, height = %.2f",resultName,resultAge,resultHeight);
自定义对象的归档解档,
只需要在自定义类里遵循NSSecureCoding(NSCoding iOS 12后删除)协议,而且必须实现归档方法(encodeWithCoder(aCoder:NSCoder))和解档方法(init?(coder aDecoder: NSCoder))
自定义对象遵循和继承NSObject
class Student:NSObject, NSSecureCoding {var name: String = ""var teacher: String = ""var age: Int = 0var isMale: Bool = falsestatic var supportsSecureCoding: Bool = trueoverride init() {super.init() }func encode(with coder: NSCoder) {coder.encode(name, forKey: "name")coder.encode(teacher, forKey: "teacher")coder.encode(age, forKey: "age")coder.encode(isMale, forKey: "isMale")}required init?(coder: NSCoder) {self.name = coder.decodeObject(forKey: "name") as! Stringself.teacher = coder.decodeObject(forKey: "teacher") as! Stringself.age = Int(coder.decodeInt32(forKey: "age"))self.isMale = coder.decodeBool(forKey: "isMale")}
}
归档
let archiverPath = NSHomeDirectory() + "/Documents/xiaohongInfo.plist"private func archiverStudent() {let xiaohong = Student()xiaohong.name = "小红"xiaohong.age = 19xiaohong.isMale = truexiaohong.teacher = "Mrs.Yang"print(archiverPath)do {let data = try NSKeyedArchiver.archivedData(withRootObject: xiaohong, requiringSecureCoding: true)try data.write(to: URL(fileURLWithPath: archiverPath))} catch (let err) {print(err)}}
解档
private func unarchiverStudent() {do {let data = try Data(contentsOf: URL(fileURLWithPath: archiverPath))let xiaohong = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! Studentprint(xiaohong)} catch let error {print(error)}}
相关文档:
NSCoderClass Reference //归档和解档抽象类
NSKeyedArchiverClaee Reference //键控归档[单例] 保存
NSKeyedUnarchiverClass Reference // 解档[单例] 读取
升级Xcode 11之后踩坑归档解档
【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)相关推荐
- 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...
- iOS数据持久化--归档
一.简介 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息 归档:因为 ...
- 四种数据持久化方式(上) :属性列表与归档解档
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹. iOS开发中 ...
- 使用偏好设置、属性列表、归档解档保存数据、恢复数据
数据持久化就是将文件保存到硬盘,以便下次运行时可以读取或永久保存.iOS提供了以下几种持久化方案: NSUserDefaults (偏好设置) property list 即Plist (属性列表) ...
- iOS 利用归档解档实现类似微博及一些CRM类软件的草稿箱思路
实际上就是写一个model类 然后将要存数据放到model中,然后将model添加到数组,然后对数组及数组中放的model归档,本地存储起来,解档,拿到数据在需要的地方显示出来 因为model是一个自 ...
- IOS 利用运行时机制来进行归档解档
前言:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置,就会变的很轻松! 首先需要导入<objc/runtime ...
- 【iOS数据持久化】Plist使用
iOS数据持久化Plist使用 iOS 端数据持久化就是把数据保存在本地,常用于基本信息储存,应用配置,应用支持数据源,网络请求缓存等.主要有如下几种方式: 方式 介绍 特点 Plist文件 属性列表 ...
- ios基础之归档和解档
ios基础之归档和解档 有些api函数已经不在支持了但是我先把之前的api学好,再学后来新出的api函数 系统选取最新的,ios系统也是最新的 // // Teacher.h // 22-归档解档 / ...
- runtime自动归档/解档
原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...
最新文章
- 黄雷:展开数据的翅膀,在更宽广的路上飞驰人生 | 提升之路系列(三)
- python导入mongo数据库文件
- SAP ABAP开发实用快捷键
- DHCP 服务原理:Snooping和Relay
- MEP(minimum error pruning) principle with python implemention
- ehcache 默认大小_简单的使用ehcache
- r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析
- 数据结构基础(18) --哈希表的设计与实现
- python re包_使用Python中的re包将句子分成子句
- 重庆c语言历届试题,历届重庆市计算机C语言二级考试试题及答案.doc
- cad隐藏图层命令快捷键_CAD各种插件大全汇总,1G多绘图神器+快捷键命令大全,无套路分享...
- 人脸识别活体检测的几种方法
- WinRAR下载官方免费版
- 罗格斯的计算机科学博士奖学金,本科直博如何“牛”转乾坤斩获全奖博士录取,师兄制胜申请经历大揭秘!...
- 不知如何走的立交桥(西直门交警一文背景)
- xshell 执行脚本API介绍(附带xsh的python包)
- 软件工程导论E-R图、盒图(N-S图)、PAD图
- msde2000修改服务器名,MSDE2000数据库怎么修改SA口令?
- Android实现三角形气泡效果方式汇总,高级安卓面试题及答案2019
- 基于PHP+MYSQL宠物领养系统的开发与设计