归档

来源:互联网 发布:java写一个猜数字游戏 编辑:程序博客网 时间:2024/04/28 03:51

在Objective-C语言中,归档是一个过程,

即用某种格式来保存一个或多个对象,以便以后还原这些对象。

类似于Java中的序列化和反序列化。


在Mac OS X上的应用程序使用XML属性列表(或plists)

存储诸如默认参数选择、应用程序设置和配置信息这样的数据。


使用PropertyList Editor程序来创建属性列表。

使用NSPropertyListSerialization类在文件中写入或读取属性列表可以在不同的平台之间移植。


归档方法一般包括:

1)对于NSString,NSArray,NSDictionary,NSData,NSNumber,使用XML属性列表进行归档。(如果可能,尽量在程序中使用XML属性列表)

        NSArray *array = [[NSArrayalloc] initWithObjects:@"one",@"two", @"three",nil];

        NSArray *arr;

        

        if ([arraywriteToFile:@"File"atomically:YES]) {

            NSLog(@"Success");

        }

        

        arr = [[NSArrayalloc] initWithContentsOfFile:@"File"];

        //arr = [NSArray arrayWithContentsOfFile:@"File"];


2)对于不只上述对象,使用NSKeyedArchiver归档。

        [NSKeyedArchiverarchiveRootObject:array toFile:@"File"];

        arr = [NSKeyedUnarchiverunarchiveObjectWithFile:@"File"];


自定义对象:

必须告知系统如何归档(或编码)你的对象,以及如何解归档(或解码)它们。

这是按照<NSCoding>协议,在类定义中添加encodeWithCoder:方法和initWithCoder:方法实现的。

每次归档程序想要根据指定的类编码对象时,都将调用encodeWithCoder:方法,

该方法告知归档程序如何进行归档。

类似地,每次从指定的类解码对象时,都会调用initWIthCoder:方法。

一般而言,编码方法应该指定如何归档想要保存的对象中的每个实例变量。


-(void)encodeWithCoder:(NSCoder *)encode {
[super encoderWithCoder:encoder];//继承的变量也符合,被编码

[encode encodeObject:name  forKey:@"sb.name"];
[encode encodeObject:name  forKey:@"sb.age"];

}
-(id)initWithCoder:(NSCoder *)decoder {
[super initWithCoder:decoder];

self.name = [decoder decoderObjectForKey:@"sb.name"];
self.age = [decoder decoderObjectForKey:@"sb.age"];
}

若对象中含有基本数据类型,用encodeObject:forKey:和decodeObject:forKey进行编码和解码
//encodeInt:forKey:   decodeInt:forKey:


3)对于编码多个对象,使用NSData创建自定义档案。

data = [NSMutable data];//创建一个空缓冲区,可随着需要而扩展

NSKeyedArchiver *ka = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

//对于解码用initForReadingMutableData:

[ka encoderObject:obj1  forKey@"obj1"];//obj1和obj2都实现了<NSCoding>

[ka encoderObject:obj2  forKey@"obj2"];

[ka finishEncoding];

if([data writeToFile:@"file"  atomically:YES]){};


从档案文件中恢复数据很简单:所做的工作只需和归档文件相反。

首先,需要像以前那样分配一个数据空间。

其次,把档案文件中的数据读入该数据空间。

然后,需要创建一个NSKeydUnarchiver对象,并告知它从指定的空间解码数据。

必须调用解码方法来提取和解码归档的对象,做完之后,向NSKeyedUnarchiver对象发送一条finishDecoding消息。


使用归档程序复制对象:

可以使用Foundation的归档功能来创建对象的深复制。

即编码,解码后生成了深拷贝的副本,连集合中的对象都是对象复制,可不用实现<NSCoping>.

0 0