简介

归档(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)相关推荐

  1. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  2. iOS数据持久化--归档

    一.简介 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息 归档:因为 ...

  3. 四种数据持久化方式(上) :属性列表与归档解档

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹. iOS开发中 ...

  4. 使用偏好设置、属性列表、归档解档保存数据、恢复数据

    数据持久化就是将文件保存到硬盘,以便下次运行时可以读取或永久保存.iOS提供了以下几种持久化方案: NSUserDefaults (偏好设置) property list 即Plist (属性列表) ...

  5. iOS 利用归档解档实现类似微博及一些CRM类软件的草稿箱思路

    实际上就是写一个model类 然后将要存数据放到model中,然后将model添加到数组,然后对数组及数组中放的model归档,本地存储起来,解档,拿到数据在需要的地方显示出来 因为model是一个自 ...

  6. IOS 利用运行时机制来进行归档解档

    前言:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置,就会变的很轻松! 首先需要导入<objc/runtime ...

  7. 【iOS数据持久化】Plist使用

    iOS数据持久化Plist使用 iOS 端数据持久化就是把数据保存在本地,常用于基本信息储存,应用配置,应用支持数据源,网络请求缓存等.主要有如下几种方式: 方式 介绍 特点 Plist文件 属性列表 ...

  8. ios基础之归档和解档

    ios基础之归档和解档 有些api函数已经不在支持了但是我先把之前的api学好,再学后来新出的api函数 系统选取最新的,ios系统也是最新的 // // Teacher.h // 22-归档解档 / ...

  9. runtime自动归档/解档

    原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...

最新文章

  1. 黄雷:展开数据的翅膀,在更宽广的路上飞驰人生 | 提升之路系列(三)
  2. python导入mongo数据库文件
  3. SAP ABAP开发实用快捷键
  4. DHCP 服务原理:Snooping和Relay
  5. MEP(minimum error pruning) principle with python implemention
  6. ehcache 默认大小_简单的使用ehcache
  7. r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析
  8. 数据结构基础(18) --哈希表的设计与实现
  9. python re包_使用Python中的re包将句子分成子句
  10. 重庆c语言历届试题,历届重庆市计算机C语言二级考试试题及答案.doc
  11. cad隐藏图层命令快捷键_CAD各种插件大全汇总,1G多绘图神器+快捷键命令大全,无套路分享...
  12. 人脸识别活体检测的几种方法
  13. WinRAR下载官方免费版
  14. 罗格斯的计算机科学博士奖学金,本科直博如何“牛”转乾坤斩获全奖博士录取,师兄制胜申请经历大揭秘!...
  15. 不知如何走的立交桥(西直门交警一文背景)
  16. xshell 执行脚本API介绍(附带xsh的python包)
  17. 软件工程导论E-R图、盒图(N-S图)、PAD图
  18. msde2000修改服务器名,MSDE2000数据库怎么修改SA口令?
  19. Android实现三角形气泡效果方式汇总,高级安卓面试题及答案2019
  20. 基于PHP+MYSQL宠物领养系统的开发与设计

热门文章

  1. 改善代码设计 —— 总结篇(Summary)
  2. 这才是我想要的云盘工具
  3. nginx 缓存时间说明
  4. Internet设置-连接选项卡-局域网(LAN)设置 某些设置由系统管理员进行管理
  5. SQL查询分析器使用
  6. OO--第三单元规格化设计 博客作业
  7. 关于GitHub推送时发生Permission denied (publickey)的问题
  8. 使用Wamp搭建Php本地开发环境,HBuilder调试
  9. 【Keras学习】常见问题与解答
  10. 【Lintcode】046.Majority Number