ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
来源:互联网 发布:上海8院811所知乎 编辑:程序博客网 时间:2024/05/16 10:44
归档和解档
一、 简介
归档(Archive)也称为序列化(serialization),把对象转化为字节码,一文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundation和Cocoa Touch类都可以),将文档上的字节码转化为对象的过程叫做解档(unarchive)也叫反序列化(unserialization)
归档的数据类型要求; NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary五种类型,如果不能归档,我们可以尝试转化为这五种中的任何一种再进行存储
二、 归档类型(3种)
1、框架类(或者已经遵守NSCoding协议的自定义类)中的单个对象进行归档解档(一次只能归档一个,多个需要分开多次归档)
2、归档多个对象
3、自定义对象的归档解档,只需要在自定义类里遵循NSCoder协议,而且必须实现归档方法(encodeWithCoder(aCoder:NSCoder))和解档方法(init?(coder aDecoder: NSCoder))即可以向1一样方便归档和解档。
实现代码:
//数据持久化之归档解档 func useArchive(){ //1使用单对象归解档 //创建一个归档对象 var data:Dictionary = ["name":"Tom"] //获取沙盒文件路径 let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true )[0] as NSString//只有转换为NSString才可以调用下面的方法 let path = paths.stringByAppendingPathComponent("archiveFile.plist")//由于归档会加密,所以后缀名可以随意 //进行归档 NSKeyedArchiver.archiveRootObject(data, toFile: path) //解档 let unarchiveData = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! NSDictionary//注意不可以转换为dictionary,只能转换为NSDictionary[为什么了???可能只有NS+继承了object吧!] print(unarchiveData)//打印结果为name = Tom //2多对象归档、解档(需要进行编码解码) //注意点:编码 let data2 = NSMutableData()//用于编码存放 let archiver = NSKeyedArchiver(forWritingWithMutableData: data2) //编码 archiver.encodeObject("Tom", forKey: "name") archiver.encodeInt(21, forKey: "age") archiver.encodeDouble(65.4, forKey: "weight") archiver.finishEncoding()//还要结束编码 try!data2.writeToFile(path, options: NSDataWritingOptions.AtomicWrite)//使用try!不处理异常,但是如果有异常产生就会终止程序(谨慎使用) print("将编码归档成功") //解码 let unarchiveData1 = NSData(contentsOfFile: path)//记得先获得数据包 let unarchiver = NSKeyedUnarchiver(forReadingWithData: unarchiveData1!) let name = unarchiver.decodeObjectForKey("name")//再解码 let age = unarchiver.decodeIntForKey("age") let weight = unarchiver.decodeDoubleForKey("weight") unarchiver.finishDecoding() print("name=\(name) age=\(age) weight=\(weight)") //3自定义对象归档(自定义是不许遵守NScoder协议) let stu = Student(name1: "Hun", num1: 0000021) NSKeyedArchiver.archiveRootObject(stu, toFile: path) let stu2=NSKeyedUnarchiver.unarchiveObjectWithFile(path)as! Student print(stu2.name ,stu2.num) }
在3中,自定义的代码应该如下:
import Foundationclass Student:NSObject, NSCoding{ var name:String var num:Int// override init() {// super.init()// } init(name1:String,num1:Int) { name=name1 num=num1 } //实现NSCoder协议 func encodeWithCoder(aCoder: NSCoder) {//编码 aCoder.encodeObject(self.name, forKey: "name") aCoder.encodeInteger(self.num, forKey: "num") } required init?(coder aDecoder: NSCoder) {//解码 self.name = aDecoder.decodeObjectForKey("name") as! String self.num = aDecoder.decodeIntegerForKey("num") as Int }}
相关文档:
NSCoderClass Reference //抽象类
NSKeyedArchiverClaee Reference //键控存档
NSKeyedUnarchiverClass Reference //
0 0
- ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
- NSKeyedArchiver、NSKeyedUnarchiver 数据持久化归档
- iPhone开发【二十二】数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver)
- iPhone开发【二十二】数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver)
- IOS持久化之NSKeyedArchiver,NSKeyedUnarchiver
- IOS数据持久化之归档NSKeyedArchiver
- iOS数据持久化之NSKeyedArchiver(归档)
- iOS数据持久化之归档NSKeyedArchiver
- iOS开发之归档(NSKeyedArchiver)和反归档(NSKeyedUnarchiver)
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- iOS开发-进阶:数据存储之-对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- iOS开发------本地存储-NSKeyedArchiver & NSKeyedUnarchiver(归档)
- iOS数据持久化-归档NSKeyedArchiver
- 【IOS-Swift】实战笔记——数据持久化之归档NSKeyedArchiver
- ios:NSKeyedArchiver/NSKeyedUnarchiver(归档/解档)
- 专题三 Problem K
- Object-c------类的本质
- 大数据技术之Spark
- 【HUSTOJ】1029: Adding Reversed Numbers
- 线程的调度或优先级
- ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
- 浅析python函数参数类型
- UIImageView 的contentMode属性应用
- 大数据技术之Flume 配置示例
- android viewpager实现无限循环自动滚动
- APP开发框架
- 解析XML数据
- 测试
- 大数据技术之Java