ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)

归档和解档

一、     简介

归档(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 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  //

 

你可能感兴趣的:(ios,数据持久化,NAkeyUnarchiver,NSKeyeArchiver)