前言
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()