您的位置:首页 > 其它

对象归档

2016-02-04 16:17 274 查看
NSString、NSArray、NSData、NSDictionary都实现了NSCoding协议,可直接通过调用writeToFile归档,那么OBJC自定义对象类型呢?首先实现NSCoding协议,重写encodeWithCode方法和initWithCode方法,然后通过NSKeyedArchiver转换为NSData,然后通过NSData的writeToFile方法写入到文件,或者将转换后的NSData放入到NSArray或NSDictionary中调用writeToFile写入到文件便可实现包装了自定义类型的数据和字典的归档;通过NSKeyedUnarchiver读取归档文件到对象,或者通过NSArray的arrrayWithContentsOfFile或NSDictionary的dictionaryWithContentsOfFile到数组对象或字典,然后取出序列化过的自定义对象(即自定义对象的NSData形式),然后通过NSKeyedUnarchiver反归档到对象。

[plain] view
plaincopy

------------------------------------------------测试代码------------------------------------------------

NSString *str = @"hello";

[str writeToFile:@"/Users/lili/Desktop/str.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSArray *arr = [[NSArray alloc]initWithObjects:@"lili",@"tata", nil];

[arr writeToFile:@"/Users/lili/Desktop/arr.txt" atomically:YES];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"lili",@"男"] forKeys:@[@"name",@"sex"]];

[dict writeToFile:@"/Users/lili/Desktop/dict.txt" atomically:YES];

Person *parent = [[Person alloc]init];

parent.age = 40;

parent.name = @"lili";

Person *child = [[Person alloc]init];

child.age = 22;

child.name = @"linian";

parent.child = child;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:parent];

[data writeToFile:@"/Users/lili/Desktop/data.txt" atomically:YES];

Person *people = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lili/Desktop/data.txt"];

NSLog(@"%@",people);

NSDictionary *dictPerson = [NSDictionary dictionaryWithObjects:@[[NSKeyedArchiver archivedDataWithRootObject:parent],[NSKeyedArchiver archivedDataWithRootObject:child]] forKeys:@[@"parent",@"child"]];

[dictPerson writeToFile:@"/Users/lili/Desktop/dictPerson.txt" atomically:YES];

NSDictionary *pdict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lili/Desktop/dictPerson.txt"];

Person *tPerson = [NSKeyedUnarchiver unarchiveObjectWithData:[pdict objectForKey:@"parent"]];

NSLog(@"%@",tPerson);

NSArray *arrPerson = [[NSArray alloc]initWithObjects:[NSKeyedArchiver archivedDataWithRootObject:parent],[NSKeyedArchiver archivedDataWithRootObject:parent], nil];

[arrPerson writeToFile:@"/Users/lili/Desktop/arrPerson.txt" atomically:YES];

NSArray *pArr = [NSArray arrayWithContentsOfFile:@"/Users/lili/Desktop/arrPerson.txt"];

Person *aPerson = [NSKeyedUnarchiver unarchiveObjectWithData:[pArr objectAtIndex:0]];

NSLog(@"%@",aPerson);

------------------------------------------------Person类------------------------------------------------

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property(strong,nonatomic)Person *child;

@property(assign,nonatomic)int age;

@property(copy,nonatomic)NSString *name;

@end

#import "Person.h"

@implementation Person

-(NSString *)description

{

return [NSString stringWithFormat:@"{age:%d,name:%@,child:%@}",self.age,self.name,self.child];

}

-(void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeInt:self.age forKey:@"age"];

[aCoder encodeObject:self.name forKey:@"name"];

[aCoder encodeObject:self.child forKey:@"child"];

}

-(id)initWithCoder:(NSCoder *)aDecoder

{

if(self = [super init]){

self.age = [aDecoder decodeIntForKey:@"age"];

self.name = [aDecoder decodeObjectForKey:@"name"];

self.child = [aDecoder decodeObjectForKey:@"child"];

}

return self;

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: