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