iOS

前言

	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()
    
原文地址:https://www.cnblogs.com/QianChia/p/5777486.html