首页 > 代码库 > iOS文档序列化(对象归档)

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的值。