Objective-C 对象进阶:归档的概念和用法

来源:互联网 发布:淘宝修改我的评价 编辑:程序博客网 时间:2024/06/11 05:18

归档的概念和用法

概念:对象归档是指将对象写入文件保存在硬盘的文件内,当在次打开程序时,可以还原这些对象。

也可以称为对象序列化、对象持外化。


数据持久化的方式:

    1> NSKeyedArchiver --- 对象归档

    2> NSUserDefaults

        NSUserDefaults 只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

        NSUserDefaults 是个plist文件,建议只是简单快速地保存小型数据,正如其名 -用户的设置。

    3> 属性列表化 (NSArrayNSDictionary保存文件)

    4> SQLite 数据库、Core Data 数据库


归档的形式:

    1>  Foundation 库中对象进行归档

    2> 自定义对象进行归档 (需要实现归档协议、NSCoding)


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


//

//  main.m

//  ArchiverDemo


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{


    @autoreleasepool {

        

        /**

         * 第一种方式

         * 实现一个数组的序列化和反序列化

         * 一个序列化对象只能序列化一个对象到指定的文件中。

         */

        

        // 序列化 数组归档

        NSArray *array = @[@"abc",@"123",@123456];

        NSString *homePath = NSHomeDirectory();

        NSString *path = [homePath stringByAppendingPathComponent:@"archiveDemo.archive"];

        

        BOOL sucess = [NSKeyedArchiver archiveRootObject:array toFile:path];

        if (sucess)

        {

            NSLog(@"archive sucess");

        }

        

        // 反序列化 解归档

        NSArray *array1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

        NSLog(@"%@", array1); 

    }

    return 0;

}


//

//  main.m

//  ArchiverDemo


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{


    @autoreleasepool {

        /**

         * 第二种方式

         * 一个基本数据类型和一个object-C对象类型,进行对象归档和解归档。

         * 可以序列化多个对象

         */

        

        // 序列化

        NSString *homePath = NSHomeDirectory();// 获取当前路径

        // 生成归档文件

        NSString *filePath = [homePath stringByAppendingPathComponent:@"test.archive"];

        // 创建 NSMutableData 对象

        NSMutableData *data = [NSMutableData data];

        // 创建归档对象

        NSKeyedArchiver *archive = [[NSKeyedArchiver allocinitForWritingWithMutableData:data];

        // 归档数据

        NSArray *array = @[@"jack"@"tom"];

        [archive encodeFloat:50 forKey:@"weight"];

        [archive encodeObject:@"jack" forKey:@"name"];

        [archive encodeObject:array forKey:@"array"];

        [archive finishEncoding];

        // 生成文件

        [data writeToFile:filePath atomically:YES];

        

        // 反序列化

        NSData *content = [NSData dataWithContentsOfFile:filePath];

        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver allocinitForReadingWithData:content];

        float weight = [unarchiver decodeFloatForKey:@"weight"];

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

        NSArray *array1 = [unarchiver decodeObjectForKey:@"array"];

        NSLog(@"weith:%0.2f, name:%@, array1:%@", weight, name, array1);

0 0
原创粉丝点击