1、面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中
例:NSKeyedArchiver
========================================================*/
NSString *str = @”abc”;
NSString *astr = @”efg”;
NSArray *Array = [NSArray arrayWithObjects:str, astr, nil];
//保存数据
NSString *Path =
[NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) objectAtIndex:0];</wbr>
NSString *filename = [Path stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"test"];<br> [NSKeyedArchiver archiveRootObject:Array<wbr>toFile:filename];</wbr></wbr>
str = @”a”;
astr = @”";
//加载数据
NSArray *arr =
[NSKeyedUnarchiver<wbr>unarchiveObjectWithFile:
filename];<br>
str = [arr objectAtIndex:0];<br>
astr =<wbr><wbr></wbr><wbr><wbr></wbr>[arr
objectAtIndex:1];</wbr></wbr></wbr>
NSLog(@”str:%@”,str);
NSLog(@”astr:%@”,astr);
2、在nsstring 的类的定义中已经添加了协议 即他是实现了nscoding 代理的方法的。
@interface NSString : NSObject
NScoding 是一个协议,主要有下面两个方法
-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据
NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。
NSKeyedUnarchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr>从二进制流读取对象。</wbr></wbr></wbr>
NSKeyedArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>把对象写到二进制流中去。</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
一般是在自己定义的类中需要在.h 文件中加入
在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用
例如对一个数据类的封装如下:
@interface Restaurant : NSObject {
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString*
shopID;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString*
title;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString*
discount;<wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString*
address;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br>
}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
@property (nonatomic, copy) NSString *shopID;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *discount;
@property (nonatomic, copy) NSString *address;
@end
@implementation Restaurant
@synthesize shopID,title,discount,address;
-(void)dealloc
{
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[shopID
release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[title
release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[discount
release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[address
release];<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[super dealloc];<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br> }<br></wbr></wbr></wbr></wbr></wbr></wbr>
- (id)initWithCoder:(NSCoder *)coder
{
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if
(self = [super init]) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>shopID
= [[coder decodeObjectForKey:@"shopid"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>title<wbr><wbr></wbr><wbr>=
[[coder decodeObjectForKey:@"title"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>discount=[[coder
decodeObjectForKey:@"discount"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>address=[[coder
decodeObjectForKey:@"address"] retain];
<wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>return
self;<br>
}<br><br>
-(void)encodeWithCoder:(NSCoder *)coder<br>
{<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder
encodeObject:shopID forKey:@"shopid"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder
encodeObject:title forKey:@"title"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder
encodeObject:discount forKey:@"discount"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder
encodeObject:address
forKey:@"address"];<wbr><wbr></wbr><br>
}<br>
@end</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
下一步就是保存和加载数据了:
注:history对象是一个NSMutableArray数组,用来装Restaurant对象。
-(void) saveArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//保存<br> {</wbr></wbr></wbr></wbr></wbr>
<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//获取路径和保存文件<br></wbr></wbr></wbr>
<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSArray<wbr><wbr></wbr><wbr>*paths = NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"history.dat"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if (history && [history count]>0) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[NSKeyedArchiver archiveRootObject:history<wbr>toFile:filename];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}else {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//删除归档文件<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSFileManager<wbr>*defaultManager = [NSFileManager defaultManager];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if ([defaultManager isDeletableFileAtPath:filename]) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[defaultManager removeItemAtPath:filename error:nil];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
-(void) loadArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//加载<br> {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSArray<wbr><wbr></wbr><wbr>*paths = NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"history.dat"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>self.history= [NSKeyedUnarchiver<wbr>unarchiveObjectWithFile:filename];<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>