iOS 对象持久化之- 归档 archiving
在理解归档之前,首先要理解对象图(object graph)的概念,对象图就是对象之间经由指针等关系链接在一起形成的对象之间的关系图。
我们需要将这个对象体系或其部分对象持久化保存到文件中,在以后某时刻从文件中恢复出来之前的对象体系,这就是持久化要达成的目标。cocoa中已经实现了两种用于持久化的文件类型,就是nib文件和property list文件。
这两种文件对于要持久化到文件中的对象类型都有严格要求,不适合用于自定义对象的持久化,而归档archive技术则是用于自定义对象持久化的不错的选择。
要支持归档,对象必须遵守并实现NSCoding协议,该协议有两个方法组成。一个用于将对象的属性归档到文件,而另一个用于从文件中恢复归档的属性值并初始化对象的属性。
基本数据类型NSArray, NSDictionary, NSString, NSData, NSDate, NSNumber, NSData以及相应的可变版本,大部分UIKit对象已经支持NSCoding,可以进行归档。
归档是一种数据转换过程,即将一组互相关联的对象转换为可存储及在应用程序间进行传递的形式。归档的最终结果—一份档案—是一份字节流,其中记录对象标识、对象封装的值以及对象间的关系。解档是相反的过程,它根据档案重新构建出完全相同的对象网络。
归档为对象持久化提供了通用的方案。开发者无需再按照某种特定文件格式输出对象的数据,而是将模型对象存储在可以输出成为文件的档案。通过 归档,应用程序也可以将一个对象网络—通常称为对象图—传递给另外的应用程序。应用程序经常使用归档来实现诸如复制和粘贴这种剪贴板操作。

如果类希望将实例保存到档案,则需要采用NSCoding协议,同时需实现协议要求的用于编解码对象的方法。Cocoa档案能够保存Objective-C对象、标量数值、C数组、结构体、字符串。档案会保存对象类型及其封装数据。如此一来,从字节流解码出来对象和编码成字节流的原始对象就完全相同。
键归档器和顺序归档器
Foundation框架提供两套类用于归解档对象网络。每套类都包含用于启动归解档过程的方法以及用于编解码对象实例数据的方法。这些类的对象有时也被称为归档器和解档器。
-
键归档器和键解档器 (
NSKeyedArchiver和NSKeyedUnarchiver)。此类对象使用字符串作为键来标识待编解码数据。开发者,尤其是新应用程序的开发者,偏爱使用此类对象执行归档解档操作。 -
顺序归档器和顺序解档器 (
NSArchiver和NSUnarchiver)。“旧风格”归档以某种顺序编码对象状态,解档也需按照相同的顺序。这种方式只打算提供给遗留代码使用,新的应用程序应该使用键归档器。
创建和解码键档案
应用程序可以调用NSKeyedArchiver的 archiveRootObject:toFile:方法来创建档案。方法第一个参数接受一个对象图的根对象引用。从根对象开始,图中所有遵循NSCoding协议的对象都有一次将自身编码到档案的机会。归档生成的字节流将被写入指定文件。
解档按相反方向进行。应用程序通过调用 NSKeyedUnarchiver类的unarchiveObjectWithFile:方法来解档。您需要为方法提供一份档案,然后它会要求对象图中对象所属类解码相关字节流,并据此重建对象。如此循环进行,直至重建出对象图。方法最终会返回根对象的引用。
NSKeyedArchiver类的archivedDataWithRootObject: 和 unarchiveObjectWithData: 两个方法和上述的方法一样,不过它们处理数据对象而不是处理文件。

浙公网安备 33010602011771号