歸檔與反歸檔
- 復雜對象就是在Foundation框架內不存在的數據類,例如我們自定義的Person類。
- 復雜對象無法通過writeToFile:的方法進行數據持久化,只能通過將復雜對象轉化為NSData(這個步驟就是歸檔),然后在通過writeToFile:寫入文件。
- 復雜對象寫入文件的過程(讀取文件->歸檔->NSData->writeToFile)。
- 從文件中讀取NSData數據,然后將NSData轉換為復雜對象(這個步驟就是反歸檔)
- 從文件中讀取復雜對象的過程(讀取文件->NSData->反歸檔->復雜對象)
準備工作
首先復雜對象所屬的類要遵守<NSCoding>協議。然后再實現協議中的兩個方法
- 歸檔(序列化)時調用的方法
-(void)encodeWithCoder:(NSCoder *)aCoder;
- 反歸檔(反序列化)時調用的方法
-(nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
- 遵守NSCoding協議
@interface Archiver : NSObject<NSCoding>
@property (strong, nonatomic)NSString *name;
@property (assign, nonatomic)NSInteger age;
@property (strong, nonatomic)NSString *address;
@property (strong, nonatomic)UIImage *photo;
@end
- 實現協議中的兩個方法
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeObject:self.address forKey:@"address"];
[aCoder encodeObject:self.photo forKey:@"photo"];
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.address = [aDecoder decodeObjectForKey:@"address"];
self.photo = [aDecoder decodeObjectForKey:@"photo"];
}return self;
}
- 注意:在對對象進行歸檔和犯規當的時候,我們需要針對不同數據類型,采用與之相匹配的歸檔和反歸檔的方法,才能夠成功的進行歸檔與反歸檔。
- 獲取文件路徑的方法
-(NSString *)GetThefilePath:(NSString *)filePath{
NSString *Path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:filePath];
return Path;
}
同時對多個對象進行歸檔
歸檔
- 準備數據
CGPoint point = CGPointMake(1.0, 2.0);
NSString *info = @"坐標原點";
NSInteger value = 10;
- 獲取要存儲的文件路徑
NSString *multiHome = [self GetThefilePath:@"multi.archiver"];
- 準備一個NSMutableData,用于保存歸檔后的對象
NSMutableData *data = [[NSMutableData alloc] init];
- 創建歸檔工具
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
- 進行歸檔
歸檔的時候,是根據鍵-值對應的關系將對象轉換為NSData類型的數據。
[archiver encodeCGPoint:point forKey:@"kPoint"];
[archiver encodeObject:info forKey:@"kInfo"];
[archiver encodeInteger:value forKey:@"kValue"];
- 歸檔結束
[archiver finishEncoding];
- 將數據寫入文件中,這一步才是真正的對數據進行了持久化。
[data writeToFile:multiHome atomically:YES];
反歸檔
- 從文件中讀取NSData數據(也就是歸檔后的數據)
NSMutableData *datR = [[NSMutableData alloc]initWithContentsOfFile:
[self GetThefilePath:@"multi.archiver"]];
- 創建反歸檔工具
NSKeyedUnarchiver *unchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:datR];
- 進行反歸檔
注意:什么類型的對象就要用什么類型的方法來反歸檔,也需要用相同類型的對象來接收
CGPoint point = [unchiver decodeCGPointForKey:@"kPoint"];
NSString *info = [unchiver decodeObjectForKey:@"kInfo"];
NSInteger value = [unchiver decodeIntegerForKey:@"kValue"];
- 反歸檔結束
[unchiver finishDecoding];
對自定義的類進行歸檔與反歸檔
歸檔
- 準備數據
NSString *name = @"小紅";
NSInteger age = 22;
NSString *address = @"西安";
UIImage *photo = [UIImage imageNamed:@"5.png"];
Archiver *archiver = [[Archiver alloc]init];
archiver.name = name;
archiver.age = age;
archiver.address = address;
archiver.photo = photo;
- 準備一個NSMutableData,用于保存歸檔后的對象
NSMutableData *data = [[NSMutableData alloc]init];
- 創建歸檔工具
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
- 進行歸檔
歸檔的時候,是根據鍵-值對應的關系將對象轉換為NSData類型的數據。
[archive encodeObject:archiver forKey:@"arc"];
- 歸檔結束
[archive finishEncoding];
- 將數據寫入文件中,這一步才是真正的對數據進行了持久化。
[data writeToFile:[self GetThefilePath:@"archiver.archiver"] atomically:YES];
反歸檔
- 從文件中讀取NSData數據(也就是歸檔后的數據)
NSMutableData *data = [[NSMutableData alloc]initWithContentsOfFile:
[self GetThefilePath:@"archiver.archiver"]];
- 創建反歸檔工具
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
- 進行反歸檔
注意:什么類型的對象就要用什么類型的方法來反歸檔,也需要用相同類型的對象來接收
Archiver *arch = [unarchiver decodeObjectForKey:@"arc"];
- 反歸檔結束
[unarchiver finishDecoding];