归档和解档
一、 简介
归档(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) }
import Foundation class 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 //