iOS文档序列化(对象归档)

对象归档:

概念:

对象归档是指将对象写入文件保存在硬盘,当再次又一次打开程序时,能够还原这些对象。也称:对象序列化、对象持久化。


数据持久性的方式(事实上就是3类)

1,NSKeyedArchiver——对象归档

2,NSUserDefaults  3,属性列表 

4,SQLite数据库  5,Core Data数据库


归档方式:

对Foundation库中对象进行归档

自己定义对象进行归档(须要实现归档协议,NSCoding)


归档与属性列表的差别:

1,归档后的文件是加密的,属性列表是明文的。

2,属性列表不能存储自己定义对象类型,归档能够。



代码实现:

//对象归档,对象反归档
int main(int argc, char * argv[])
{
    @autoreleasepool {
//        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        //归档(序列化)
        NSArray *array = @[@"abc",@"123",@1234];
        
        NSString *homePath = NSHomeDirectory();
        NSLog(@"homePath :%@",homePath);
        NSString *path = [homePath stringByAppendingPathComponent:@"test.archive"];  //文件和扩展名随便取
        
        BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:path];
        if (success) {
            NSLog(@"archive success");
        }
    }
    return 0;
}


这是就生成了一个加密文件。

打开

6270 6c69 7374 3030 d401 0203 0405 081c
1d54 2474 6f70 5824 6f62 6a65 6374 7358
2476 6572 7369 6f6e 5924 6172 6368 6976
6572 d106 0754 726f 6f74 8001 a609 0a12
1314 1555 246e 756c 6cd2 0b0c 0d0e 5624
636c 6173 735a 4e53 2e6f 626a 6563 7473
8005 a30f 1011 8002 8003 8004 5361 6263
5331 3233 1104 d2d2 1617 181b 5824 636c
6173 7365 735a 2463 6c61 7373 6e61 6d65
a219 1a57 4e53 4172 7261 7958 4e53 4f62
6a65 6374 574e 5341 7272 6179 1200 0186
a05f 100f 4e53 4b65 7965 6441 7263 6869
7665 7208 1116 1f28 3235 3a3c 4349 4e55
6062 6668 6a6c 7074 777c 8590 939b a4ac
b100 0000 0000 0001 0100 0000 0000 0000
1e00 0000 0000 0000 0000 0000 0000 0000


 

int main(int argc, char * argv[])
{
    @autoreleasepool {
//        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        //归档(序列化)
//        NSArray *array = @[@"abc",@"123",@1234];
//        
//        NSString *homePath = NSHomeDirectory();
//        NSLog(@"homePath :%@",homePath);
//        NSString *path = [homePath stringByAppendingPathComponent:@"test.archive"];  //文件和扩展名随便取
//        
//        BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:path];
//        if (success) {
//            NSLog(@"archive success");
//        }
        
        //解归档(反序列化)
        NSString *homePath = NSHomeDirectory();
        NSString *path = [homePath stringByAppendingPathComponent:@"test.archive"];
        NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"NSKeyedUnarchiver:%@",array);
    }
    return 0;
}


这种方法的缺陷:

一个对象归档成一个文件,当对象许多时很麻烦。

以下的方式能够解决问题:

归档:

1,使用NSData实例作为归档的存储数据

2,加入归档的内容(设置key和value)

3,完毕归档

4,将归档数据存入磁盘中


解归档:

1,从磁盘中读取文件,生成NSData实例

2,依据Data实例创建和初始化解归档实例

3,解归档,依据key訪问value的值。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。