iOS - Swift NSKeyedArchiver 数据归档
前言
public class NSKeyedArchiver : NSCoder
public class NSKeyedUnarchiver : NSCoder
在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。
采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
1、系统类的归档/反归档
// 文件路径
let achiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/stringAchiverFile")
// 待归档的数据
let string:String = "bei jing huan yin nin"
// 归档,归档到文件
let bl:Bool = NSKeyedArchiver.archiveRootObject(string, toFile: achiverPath)
// 反归档,从文件反归档
let strFromAchiverFile:AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithFile(achiverPath)!
2、自定义类的归档/反归档
Dog.swift
// 遵守 NSCoding 协议
class Dog: NSObject, NSCoding { var name:String
var age:Int init(name:String, age:Int) {
self.name = name
self.age = age
} // 归档 方法
func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeInteger(self.age, forKey: "age")
} // 反归档 方法
required init(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObjectForKey("name") as! String
self.age = aDecoder.decodeIntegerForKey("age")
} override var description: String{
return String(format: "%@, %d", self.name , self.age)
}
}
main.swift
// 文件路径
let achiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dogAchiverFile") // Dog 类需要遵守 NSCoding 协议,并实现其协议方法
let dog:Dog = Dog(name: "xiao hei", age: 2) // 归档 // 归档到文件
let bl:Bool = NSKeyedArchiver.archiveRootObject(dog, toFile: achiverPath) // 反归档 // 从文件反归档
let dogFromAchiverFile:AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(achiverPath)!
3、NSKeyedArchiver 序列化
main.swift
// 文件路径
let archiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/catAchiverFile") // Cat 类不需要遵守 NSCoding 协议
let cat1:Cat = Cat(name: "xiao bai", age: 1) var cat2:Cat = Cat(name: "", age: 0) // 归档,编码 // 设置数据区域
let archiverData:NSMutableData = NSMutableData() // 开始存储对象,编码 // 将数据区域链接到 NSKeyedArchiver 对象
let archiver:NSKeyedArchiver = NSKeyedArchiver(forWritingWithMutableData: archiverData) // 编码
archiver.encodeInteger(cat1.age, forKey: "age") // 编码完成
archiver.finishEncoding() // 将存档的数据写入文件
let bl:Bool = archiverData.writeToFile(archiverPath, atomically: true) // 反归档,解码 // 设置数据区域
let unarchiverDataArea:NSData = NSData() // 解码存储在归档文件中的对象 // 将数据区域链接到 NSKeyedUnarchiver 对象
let unarchiver:NSKeyedUnarchiver = NSKeyedUnarchiver(forReadingWithData: unarchiverDataArea) // 解码
cat2.age = unarchiver.decodeIntegerForKey("age") // 解码完成
unarchiver.finishDecoding()
iOS - Swift NSKeyedArchiver 数据归档的更多相关文章
- iOS - OC NSKeyedArchiver 数据归档
前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...
- NSKeyedArchiver数据归档
前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...
- iOS - Swift PList 数据存储
前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...
- iOS - Swift NSUserDefaults 数据存储
前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...
- iOS - Swift NSData 数据
前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutabl ...
- iOS开发 - 数据归档与恢复 NSKeyedArchiver
归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...
- IOS NSKeyedArchiver(归档存取数据)
如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- ios开发之数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...
随机推荐
- Windows下打包Python的exe可执行文件
参考:http://www.cnblogs.com/Lands-ljk/p/5447723.html
- PostgreSQL连接python,postgresql在python 连接,创建表,创建表内容,插入操作,选择操作,更新操作,删除操作。
安装 PostgreSQL可以用Python psycopg2模块集成. sycopg2是Python编程语言的PostgreSQL数据库的适配器. 其程序代码少,速度快,稳定.不需要单独安装这个模块 ...
- GPS定位原理
多分钟吧(有人认为美国对其本土覆盖的GPS信号实行不同码率因此纯GPS定位也会很快,谁有美国朋友不妨让他拔卡试试)!因为美版机型其GPS模块的数据处理软件部分与欧版机型是不同的,欧版机型的数据处理软件 ...
- YTU 2344: 先序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: ...
- YTU 2974: C语言习题5.26--文件操作3
2974: C语言习题5.26--文件操作3 时间限制: 1 Sec 内存限制: 128 MB 提交: 213 解决: 92 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...
- 使用 MNIST 图像识别数据集
机器学习领域中最迷人的主题之一是图像识别 (IR). 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人.MNIST 数据集是可用于实验的简单 ...
- 跟我一起Django - 01 安装和初始化
跟我一起Django - 01 安装和初始化 python环境 C:\Python27\Lib\site-packages>python --versionPython 2.7.5 安装setu ...
- Finding Nemo 分类: POJ 2015-07-11 10:11 10人阅读 评论(0) 收藏
Finding Nemo Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 8117 Accepted: 1883 Desc ...
- 花40分钟写一个-CBIR引擎-代码公开
浏览网页的时候发现一篇不错的文章"用Python和OpenCV创建一个图片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在浏 ...
- 2016年11月22日 星期二 --出埃及记 Exodus 20:13
2016年11月22日 星期二 --出埃及记 Exodus 20:13 "You shall not murder.不可杀人.