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
原创粉丝点击