zoukankan      html  css  js  c++  java
  • 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()
      
  • 相关阅读:
    div 水平居中 内容居左
    net core 踩坑记录
    正向代理和反向代理
    NOIP2013 | 货车运输
    【转载】字符串Hash & 【题解】好文章
    cqyz oj | 帮助Jimmy | DAG图
    cqyz oj | 猜序列
    转载 | 原码, 反码, 补码 详解
    cqyz oj | 有线电视网
    cqyz oj | 罕见的秩序 | 拓扑排序
  • 原文地址:https://www.cnblogs.com/QianChia/p/5777486.html
Copyright © 2011-2022 走看看