iOS-歸檔NSCoding序列化

歸檔

歸檔->數據持久化的方式->加密(把文件加密《不是把數據加密》

歸檔分為:

1、存儲數據(編碼、序列化、歸檔過程)

2、讀取數據(解碼、反序列化、解歸檔過程)

*可以歸檔的對象:必須遵守歸檔協議(NSSecureCoding遵守NSCoding)、實現協議方法

*除了NSObject未實現歸檔協 議其他實現了協議的類都可以歸檔(UIViewController、UIView...)


歸檔類名:NSKeyedArchiver

解歸檔類名:NSKeyedUnarchiver

*歸檔、解歸檔都是通過key來實現的

*在歸檔、解歸檔的時候key一定要對應(盡量和對象名相同)


歸檔的步驟:

1、寫存儲歸檔文件的路徑

NSArray*searchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);

*歸檔文件的尾綴盡量用.archiver

NSString*path = [[searchList lastObject]stringByAppendingPathComponent:@"list.archiver"];

2、準備要歸檔的數據

NSArray *list =@[@{@"name":@"小明",@"age":@(18),@"height":@(18.5)}];

3、開始歸檔

*把一個Object(支持歸檔)的數據以歸檔的形式存儲到指定位置

+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString

*)path;

*支持歸檔協議的對象系統幫忙對他進行了編碼

BOOLisSuccess = [NSKeyedArchiverarchiveRootObject:list toFile:path];

if(isSuccess) {

NSLog(@"%@",path);

}

解歸檔的步驟:

1、歸檔文件路徑

2、開始解歸檔

+ (nullable id)unarchiveObjectWithFile:(NSString *)path

NSArray

*list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

#pragma mark---NSData二進制的類---

*NSData二進制的類可以把文件或者數據轉成二進制的對象


多種數據歸檔步驟:

1、存儲路徑

NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString*path = [[searchListlastObject]stringByAppendingPathComponent:@"user.archiver"];

2、初始化一個可變的二進制對象**NSMutableData同時準備要歸檔的數據

NSString *name =@"mary";

NSIntegerage =18;

floatheight =172.5;

NSMutableData*Data = [NSMutableDatadata];

3、歸檔等待寫入數據的二進制對象(要把二進制對象寫入到文件)->讓歸檔對象幫他寫入

NSKeyedArchiver *arc = [[NSKeyedArchiver

alloc]initForWritingWithMutableData:Data];

4、使用歸檔對象對要歸檔的數據進行編碼(同時寫入到二進制對象-系統幫咱們操作)(編碼結束就會把編碼后的數據寫入二進制對象)

*編碼:encode解碼:decode

*要用對應的數據類型進行編碼

[arc encodeObject:name forKey:@"name"];

[arc encodeInteger:age forKey:@"age"];

[arc encodeFloat:height forKey:@"height"];

5、編碼結束

*把編碼之后數據寫入到二進制對象

[arc finishEncoding];

6、把二進制對象存儲到指定位置

BOOLisSuccess = [Data writeToFile:pathatomically:YES];

if(isSuccess) {

NSLog(@"%@",path);

多種解歸檔:

**decode解碼

- (instancetype)initForReadingWithData:(NSData *)data

1、歸檔文件路徑

2、使用data讀取數據準備解歸檔data里面的數據

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver

alloc]initForReadingWithData:[NSData dataWithContentsOfFile:path]];

3、解歸檔數據用對應的數據類型接收

NSString*name = [unarchiver decodeObjectForKey:@"name"];

NSIntegerage = [unarchiver decodeIntegerForKey:@"age"];

floatheight = [unarchiver decodeFloatForKey:@"height"];

NSLog(@"%@

%ld? %f",name,age,height);


*自定義歸檔*:

自定義歸檔->有些數據不能歸檔->讓他遵守歸檔協議(NSCoding)->

歸檔、解歸檔都與第一種方式相同

userModel *user = [[userModel alloc]init];

user.name =@"江兒";

user.age=18;

user.height =165.5;

NSString*path = [NSHomeDirectory()stringByAppendingPathComponent:@"user.archiver"];

BOOLisOK = [NSKeyedArchiverarchiveRootObject:user toFile:path];

if(isOK) {

NSLog(@"%@",path);

}

userModel*userMode= [NSKeyedUnarchiverunarchiveObjectWithFile:path];

NSLog(@"%@ %ld %f",userMode.name,userMode.age,userMode.height);

當在歸檔位置(viewController中)調用[NSKeyedArchiver archiveRootObject:XXX toFile:XXX];會自動調用encodeWithCoder:這個代理方法

使用**歸檔方法對對象歸檔的時候會調用這個方法

- (void)encodeWithCoder:(NSCoder *)aCoder{

aCoder就是系統傳過來的NSKeyedArchiver實例化出來的對象

[aCoderencodeObject:self.name forKey:@"name"];

[aCoderencodeInteger:self.age forKey:@"age"];

[aCoderencodeFloat:self.height forKey:@"height"];

}

使用**解歸檔方法對對象解歸檔的時候會調用這個方法

- (nullableinstancetype)initWithCoder:(NSCoder*)aDecoder{

只要是構造方法先把創建對象的方法補全

//self = [super init];

//if(self) {

//}

//return self;

self= [super init];

if(self) {

當使用解歸檔方法的時候系統會自動調用initWithCoder:這個方法系統會幫咱們創建一個對象

之前的對象的數據保存在歸檔文件里面

在解歸檔的時候還原數據并且把還原的數據賦值給這個對象->現在這個對象的數據跟原來歸檔的數據是一樣的

self.name = [aDecoderdecodeObjectForKey:@"name"];

self.age = [aDecoderdecodeIntegerForKey:@"age"];

self.height = [aDecoderdecodeFloatForKey:@"height"];

}

returnself;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容