Archiving

  面向对象的程序在运行时会创建一个复杂的对象图。开发者经常要以二进制流的方法序列化这个图,该过程称为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;

}

原文地址:https://www.cnblogs.com/PJXWang/p/5332353.html