19.2.3 归档器和解档器读写数据

19.2.3 归档器和解档器读写数据

带有键的归档器(NSKeyedArchiver)和解档器(NSKeyedUnarchiver)是苹果提供的可以将任何实例和二进制数据进行转换的两个类。与属性列表的序列化不同的是,归档器可以转换任何的类型,只要是满足NSCoding协议的自定义类型都可以被NSKeyedArchiver保存下来。NSCoding协议定义了自定义类型需要实现的读写方法。归档器在对一个类型的实例进行操作时,会调用这个实例的encode()方法:

实例可以在这个方法中将自己需要归档的属性放入aCoder中,如果是从二进制的data中解档(unarchive)则用协议中定义的init()方法:

这时需要从aDecoder中将需要解档的属性读出,并设置到实例的属性上。下面我们可以声明一个类型,它满足NSCoding并且实现了encode()和init()方法,这样NSKeyedArchiver和NSKeyed Unarchiver就可以进行转换。首先创建一个ArchiverModel类,继承自NSObject类,满足NSCoding,代码示例如下:

动手写19.2.2 NSKeyedArchiverPractise->ArchiveModel.swift

这里给ArchiveModel定义了两个属性:stringProperty和numberProperty,分别是字符串和整数类型。本例重写了ArchiveModel的初始化方法,保证两个属性都有默认值。接着实现了协议NSCoding需要提供的函数——init和encode,两个函数都会接受一个参数,这个参数是一个NSCoder的实例。此外ArchiveModel提供了两个实例方法(decodeObject和encodeObject),它们都是以键值对的方式进行存取。需要注意的是,传入的Object也要满足NSCoding协议。因为这里的Int不是一个满足NSCoding协议的类型,所以需要借助NSNumber进行一次包装,包装NSCoder能够将其序列化。

接着在View Controller中添加一个方法,在页面加载完时调用,代码如下:

动手写19.2.3 NSKeyedArchiverPractise->ViewController.swift

声明一个archivedObject()方法,用ArchiveModel初始化一个实例testModel,为stringProperty和numberProperty属性都赋上值。使用归档器将实例转为二进制的testData,然后将这个实例又作为参数传递给解档器,解档器将其解档转为ArchiveModel的实例,最后使用print方法将解档后的实例打印出来,控制台输出如下:

这说明整个归档和解档的过程是成功的。