使用NSData进行归档
来源:互联网 发布:企业信息化软件需求 编辑:程序博客网 时间:2024/06/06 04:17
先前的博文中 我 提到过 我们 可以采取 encodeObject:forKey:这项措施 对基本的Objective-C物件 和 编写过编码措施及解码措施的物件 进行编码。如果 某类物件中的每一个 都包含 一些基本的数据类型,比如 整数类型int,浮点类型float,我们 必须知道 如何对他们 进行编码 和 解码。这个 在先前一篇博文中的表格里 已经列举出来了。
我们 创建 一类简单的物件MyClass。下面 是 MyClass这类物件的接口文件。
接下来 是 MyClass这类物件的实施文件:
每个MyClass类型的物件 都包含 stringValue,intValue 和 floatValue这三个变量。从MyClass这类物件的实施文件 可以看出 有 encodeWithCoder: 和 initWithCoder:这两项措施 适用于 MyClass这类物件。
这个程序中的
这行语句 先为一个NSKeyedArchiver类型的物件 分配了 内存空间,然后 将 dataArea 设定为 归档数据写入的区域。
接着 我们 对archiver这个物件 采取 encodeObject:forKey:这项措施 对需要归档的物件 进行编码,并且 给 每个需要归档的物件 给 一个关键字。最后 我们 对archiver这个物件 采取了 finishEncoding这项措施,被编好码的数据 就存储 到了 dataArea这个数据区域当中。
我们 之所以能够对 objectOfMyClass1这个MyClass类型的物件 采取 encodeObject:forKey:这项措施,是因为 我们 编写了 encodeWithCoder: 和 initWithCoder:这两项措施,并且 使 其 适用于 MyClass这类物件。
对archiver这个物件 采取 finishEncoding这项措施后,就不能再对其他物件 进行编码了。
这时 dataArea这个数据区域 就包含着 编码后需要归档的物件了,我们 可以将这些需要归档的物件 用 这样的形式 写入 文件。
这行语句 对dataArea这个数据区域 采取了 writeToFile:atomically:这项措施 将 dataArea这个区域中的数据 写入 文件myArchive。如果 数据写入 成功了,writeToFile:atomically:这项措施产生的结果 就会是 YES,如果 失败了,这项措施产生的结果 就会是 NO。
要将 归档文件中的数据 读取出来 也很 简单:先创建 一个NSData类型的物件 用作 临时存储数据的区域。接下来 将 归档文件中的数据 读取 到NSData类型的数据区域当中。然后 创建 一个NSKeyedUnarchiver类型的物件,将 这个NSKeyedUnarchiver类型物件读取数据的位置 设定为 刚刚创建的NSData数据区域。最后 我们 对这个NSKeyedUnarchiver类型的物件 采取 decodeObjectForKey:这项措施,对特定关键字所对应的物件 进行解码。解码 完成过后,我们 必须对这个NSKeyedUnarchiver类型物件 采取 finishDecoding这项措施。
下面的程序 示范了 如何完成 刚刚所说的这些步骤:
#import <Foundation/NSObject.h>#import <Foundation/NSAutoreleasePool.h>#import <Foundation/NSString.h>#import <Foundation/NSKeyedArchiver.h>#import <Foundation/NSCoder.h>#import <Foundation/NSData.h>#import "AddressBook.h"#import "MyClass.h"int main(int argc,const char *argv[]){ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; NSData *dataArea; NSKeyedUnarchiver *unarchiver; AddressBook *myBook; MyClass *objectOfMyClass; dataArea=[NSData dataWithContentsOfFile:@"myArchive"]; if(dataArea==nil) { NSLog(@"读取归档文件失败"); return 1; } unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:dataArea]; myBook=[unarchiver decodeObjectForKey:@"AddressBookMyBook"]; objectOfMyClass=[unarchiver decodeObjectForKey:@"MyClassObject"]; [unarchiver finishDecoding]; [unarchiver release]; [myBook list]; NSLog(@"%@,%i,%g",[objectOfMyClass stringValue],[objectOfMyClass intValue],[objectOfMyClass floatValue]); [pool release]; return 0;}
运行 这个程序后,可以得到 这样的结果:
从运行的结果 可以看出 AddressBook类型的物件myBook 和 MyClass类型的物件objectOfMyClass 都成功地 存储到了 归档文件当中。
From:http://www.tongwenguan.com/tag/finishencoding
- 使用NSData进行归档
- NSData归档
- 使用NSFileManage与NSData进行文件管理
- NSData 和归档解档
- 归档—使用XML属性列表进行归档
- 使用archiveRootObject进行简单的归档
- 使用BBED跳过归档进行恢复
- 【数据加密】使用XXTEA对NSData进行加密
- Object-C 基础之10 — 使用xml进行归档
- Object-C 基础之10 — 使用xml进行归档
- 使用bbed跳过丢失的归档进行recover datafile
- Object-C使用XML属性列表进行归档
- swift中使用对象归档进行数据本地
- 优雅地使用pt-archiver进行数据归档
- 使用NSData类
- NSData缓存的使用
- 进行归档的具体要求
- runtime 进行归档
- net use * /del /y---解决访问共享时提示多重连接的问题
- linux给文件或目录添加apache权限
- 今天开始学IT++,记录一下学习过程和感觉
- HUD-3308 LCIS 线段树
- BOM__Document对象简介-三种获取节点方式,通过节点层次关系获取节点,以及对象中的属性操作
- 使用NSData进行归档
- LeetCode: Container With Most Water
- 软件测试---黑盒测试
- 100个漂亮的注册和登录页面设计(附PSD)
- HDU 2121 Ice_cream’s world II(不定根最小树形图)
- rails用户认证
- jsp
- 这里为啥有个kernel_stack,没有定义,没有声明。。。。
- 下载电子书网站