iOS对象序列化
系统对象的归档我就不介绍了,这个不复杂,自己看一下就会了。
我在这里主要介绍自定义对象的归档。
Sample.h文件
9 #import <Foundation/Foundation.h> 10 11 @interface Sample : NSObject<NSCoding> { 12 13 NSString* name; 14 int magicNumber; 15 float shoeSize; 16 NSMutableArray *subThingies; 17 } 18 19 @property(copy) NSString* name; 20 @property int magicNumber; 21 @property float shoeSize; 22 @property (retain) NSMutableArray *subThingies; 23 24 25 -(id) initWithName:(NSString *)n magicNumber:(int)m shoeSize:(float) ss; 26 27 @end
Sample.m文件
9 #import "Sample.h" 10 11 @implementation Sample 12 13 @synthesize name; 14 @synthesize magicNumber; 15 @synthesize shoeSize; 16 @synthesize subThingies; 17 18 -(id) initWithName:(NSString *)n magicNumber:(int)m shoeSize:(float)ss 19 { 20 if (self=[super init]) 21 { 22 self.name = n; 23 self.magicNumber = m; 24 self.shoeSize = ss; 25 self.subThingies = [NSMutableArray array]; 26 } 27 return (self); 28 } 29 30 -(void) dealloc 31 { 32 [name release]; 33 [subThingies release]; 34 [super dealloc]; 35 } 36 37 //将对象编码(即:序列化) 38 -(void) encodeWithCoder:(NSCoder *)aCoder 39 { 40 [aCoder encodeObject:name forKey:@"name"]; 41 [aCoder encodeInt:magicNumber forKey:@"magicNumber"]; 42 [aCoder encodeFloat:shoeSize forKey:@"shoeSize"]; 43 [aCoder encodeObject:subThingies forKey:@"subThingies"]; 44 } 45 46 //将对象解码(反序列化) 47 -(id) initWithCoder:(NSCoder *)aDecoder 48 { 49 if (self=[super init]) 50 { 51 self.name = [aDecoder decodeObjectForKey:@"name"]; 52 self.magicNumber = [aDecoder decodeIntForKey:@"magicNumber"]; 53 self.shoeSize = [aDecoder decodeFloatForKey:@"shoeSize"]; 54 self.subThingies = [aDecoder decodeObjectForKey:@"subThingies"]; 55 } 56 return (self); 57 58 } 59 60 61 -(NSString*) description 62 { 63 NSString *description = [NSString stringWithFormat:@"%@:%d/%.1f %@",name,magicNumber,shoeSize,subThingies]; 64 return (description); 65 } 66 67 @end
使用模板
NSString *path = [NSString stringWithFormat:@"%@/Documents/archive.dat", NSHomeDirectory()]; Sample *s1 = [[Sample alloc] initWithName:@"thing1" magicNumber:42 shoeSize:10.5]; [s1.subThingies addObject:@"1"]; [s1.subThingies addObject:@"2"]; //序列化 NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:s1];//将s1序列化后,保存到NSData中 [s1 release]; [data1 writeToFile:path atomically:YES];//持久化保存成物理文件 //反序列化 NSData *data2 = [NSData dataWithContentsOfFile:path];//读取文件 Sample *s2 = [NSKeyedUnarchiver unarchiveObjectWithData:data2];//反序列化 NSLog(@"%@",s2);
如果是多个这类对象组成的数组,序列化也很简单,只须对这个数组进行序列化
1 Sample *s1 = [[Sample alloc] initWithName:@"thing1" magicNumber:42 shoeSize:10.5]; 2 [s1.subThingies addObject:@"1"]; 3 [s1.subThingies addObject:@"2"]; 4 5 Sample *s2 = [[Sample alloc] initWithName:@"thing2" magicNumber:22 shoeSize:22.2]; 6 [s2.subThingies addObject:@"22"]; 7 [s2.subThingies addObject:@"22"]; 8 9 NSArray *array = [NSArray arrayWithObjects:s1, s2, nil]; 10 [s1 release]; 11 [s2 release]; 12 13 NSString *path = [NSString stringWithFormat:@"%@/Documents/archive.dat", NSHomeDirectory()]; 14 //序列化 15 NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:array]; 16 [data1 writeToFile:path atomically:YES];//持久化保存成物理文件 17 //房序列化 18 NSData *data2 = [NSData dataWithContentsOfFile:path];//读取文件 19 NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:data2];//反序列化 20 NSLog(@"%@",array2);