面向对象的程序在运行时会创建一个复杂的对象图。开发者经常要以二进制流的方法序列化这个图,该过程称为archiving,也叫存档。这个二进制流可通过网络连接发送,也可以写进文件。当需要从二进制流类型重新创建对象图时,可使用unarchive.重新开始时,它将对象从编译器创建的NIB文件中unarchive就可以。
尽管对象有成员变量,也定义了方法,但只有成员变量和类的名字可进行存档,也就是说只有数据可存档,而代码不行。假如一个程序存档一个对象,另一个程序unarchive同一个对象时,这两个程序必须有这个类的代码。
1.NSCoder和NSCoding
有个命令为NSCoding的protocol,假如开发者实现了NSCoding(在.h文件中指明实现了NSCoding协议),将实现下面的方法:
-(id)initWithCoder:(NSCoder *)coder
-(void)encodeWithCoder:(NSCoder*)coder
NSCoder是二进制流的抽象,开发者可以把数据写入coder,也可以从coder中读取数据。对象中的initWithCoder:方法将从coder中读取数据,并将数据保存到它的成员变量。对象中的encodeWithCoder:方法读取他的实例变量的值,然后将那些值写入code。NSCoder是一个抽象类,不能被实例化。
1.1编码
编码常用的的一些方法:
-(void)encodeObject:(id)anObject forKey:(NSString*)key;
-(void)encodeBool:(BOOL) boolv forKey:(NSString*)key;
-(void)encodeDouble:(double)realv forKey:(NSString*)key;
-(void)encodeFloat:(float)realv forKey:(NSString*)key;
-(void)encodeInt:(int)intv forKey:(NSString*)key;
例如:
-(void)encodeWithCoder:(NSCoder *)coder
{
// [super encodeWithCoder:coder];
[coder encodeObject:personName forKey:@"personName"];
[coder encodeFloat:expectedRaise forKey:@"expectedRaise"];
}
1.2 解码
将数据从coder中解码时,可以用以下方法:
- (double)decodeObjectForKey:(NSString *)key
- (double)decodeBoolForKey:(NSString *)key
- (double)decodeDoubleForKey:(NSString *)key
- (double)decodeFloatForKey:(NSString *)key
- (double)decodeIntForKey:(NSString *)key
例如:
-(id)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
personName = [coder decodeObjectForKey:@"personName"];
expectedRaise = [coder decodeFloatForKey:@"expectedRaise"];
}
return self;
}