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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值