前言

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

iOS - Swift NSKeyedArchiver 数据归档的更多相关文章

  1. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  2. NSKeyedArchiver数据归档

    前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...

  3. iOS - Swift PList 数据存储

    前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...

  4. iOS - Swift NSUserDefaults 数据存储

    前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...

  5. iOS - Swift NSData 数据

    前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutabl ...

  6. iOS开发 - 数据归档与恢复 NSKeyedArchiver

    归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...

  7. IOS NSKeyedArchiver(归档存取数据)

    如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...

  8. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  9. ios开发之数据存储

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...

随机推荐

  1. jQuery中attr() 和 prop()【转】

    Version 1.9.0 开始不建议使用 attr() 来对具有 true 和 false 两个属性的属性进行操作. 具有 true 和 false 两个属性的属性,如 checked, selec ...

  2. iOS开发- 蓝牙后台接收数据(BLE4.0)

    最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据. 本来以后会很麻烦, 但是学习了下..发现就2步而已.简单的不能再简单了. ...

  3. Shell—学习之心得

    由于项目要招聘需要有经验shell开发人员(awk编程),而作为技术面试官(暂时)的我对shell编程不太熟:当然以前也写过一些shell脚本来满足项目的需求—备份环境,数据库(逻辑).假如只是针对a ...

  4. YTU 2019: 鞍点计算

    2019: 鞍点计算 时间限制: 1 Sec  内存限制: 64 MB 提交: 66  解决: 30 题目描述 找出具有m行n列二维数组Array的"鞍点",即该位置上的元素在该行 ...

  5. 使用NPOI随意创建Excel(含下拉列表)

    //创建工作簿 HSSFWorkbook ssfworkbook = new HSSFWorkbook(); //创建工作表(页) HSSFSheet sheet1 = ssfworkbook.Cre ...

  6. MFC编程基础

    http://www.cnblogs.com/lzmfywz/archive/2012/03/15/2399403.html 一.MFC类库概述 MFC(Microsoft Foundation cl ...

  7. tomcant报错The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

    下载与你Tomcat对应版本的 tcnative-1.dll,放到apache-tomcat-7.0.57\bin 目录下,重启tomcat http://archive.apache.org/dis ...

  8. 使用 JavaScript

    我们要用 JavaScript,但是把它写在哪里呢?   这里 ↘   1. HTML 页面中 .   2. 单独的一个文件中,文件后缀名是“.js”.     ——————————————————— ...

  9. 编写shell管理脚本(二)

    8.1  先测试“/etc/vsftpd”.“/etc/hosts”是否为目录,并通过“$?”变量查看返回状态值,据此判断测试结果.[root@localhost ~]# [ -d /etc/vsft ...

  10. ContentProvider官方教程(9)定义一个provider完整示例:实现方法,定义权限等

    Creating a Content Provider In this document Designing Data Storage Designing Content URIs Implement ...