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

来源:互联网 发布:淘宝客软文编辑器 编辑:程序博客网 时间:2024/06/06 05:57

归档的概念和用法

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

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


数据持久化的方式:

    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 = [NSKeyedArchiverarchiveRootObject:array toFile:path];

       if (sucess)

        {

            NSLog(@"archive sucess");

        }

        

        // 反序列化 解归档

       NSArray *array1 = [NSKeyedUnarchiverunarchiveObjectWithFile: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 = [NSMutableDatadata];

        // 创建归档对象

        NSKeyedArchiver *archive = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];

       // 归档数据

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

        [archiveencodeFloat:50forKey:@"weight"];

        [archiveencodeObject:@"jack"forKey:@"name"];

        [archiveencodeObject:array forKey:@"array"];

        [archivefinishEncoding];

       // 生成文件

        [datawriteToFile:filePath atomically:YES];

        

       // 反序列化

       NSData *content = [NSDatadataWithContentsOfFile:filePath];

       NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData: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);

        

    }

   return 0;

}




原创粉丝点击