iOS - OC NSKeyedArchiver 数据归档

前言

    @interface NSKeyedArchiver : NSCoder
    @interface NSKeyedUnarchiver : NSCoder
  • 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。
  • 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
  • 缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
  • iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。

1、系统类的归档/反归档

    // 文件路径
    NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/stringAchiverFile"];

    // 待归档的数据
    NSString *string = @"bei jing huan yin nin";

    // 归档,归档到文件
    bool bl = [NSKeyedArchiver archiveRootObject:string toFile:achiverPath];

    // 反归档,从文件反归档
    NSString *strFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];

2、自定义类的归档和反归档

  • Dog.h

        // 遵守 NSCoding 协议
        @interface Dog : NSObject <NSCoding>
    
        @property (nonatomic, assign)int age;
        @property (nonatomic, copy)NSString *name;
    
        + (Dog *)dogWithName:(NSString *)name andAge:(int)age;
    
        @end
  • Dog.m
        // 实现 NSCoding 协议方法
        @implementation Dog
    
        // 归档 方法,使用编码器将对象编码成二进制数据流,归档(持久化存储)
        - (void)encodeWithCoder:(NSCoder *)aCoder{
    
            [aCoder encodeInt:self.age forKey:@"age"];
            [aCoder encodeObject:self.name forKey:@"name"];
        }
    
        // 反归档 方法,将保存在磁盘上的二进制数据流,解码成 OC 对象
        - (id)initWithCoder:(NSCoder *)aDecoder{
    
            self.age = [aDecoder decodeIntForKey:@"age"];
            self.name = [aDecoder decodeObjectForKey:@"name"];
    
            return self;
        }
    
        @end
  • main.m
        #import "Dog.h"
    
        // 文件路径
        NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dogAchiverFile"];
    
        Dog *dog = [Dog dogWithName:@"xiao hei" andAge:5];
    
        // 归档
    
            // 归档到文件
            BOOL bl = [NSKeyedArchiver archiveRootObject:dog toFile:achiverPath];
    
        // 反归档
    
            // 从文件反归档
            Dog *dogFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];

3、NSKeyedArchiver 序列化

  • main.m

        // Cat 类不需要遵守 NSCoding 协议,也不需要其协议方法
        #import “Cat.h”
    
        // 文件路径
        NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/catAchiverFile"];
    
        // 归档,编码
    
            Cat *cat1 = [Cat catWithName:@"xiao bai" andAge:2];
    
            // 设置数据区域
            NSMutableData *achiverDataArea = [NSMutableData data];
    
            // 开始存储对象,编码
    
                // 将数据区域链接到 NSKeyedArchiver 对象
                NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:achiverDataArea];
    
                // 可以存储类的实例变量
                [archiver encodeObject:cat1.name forKey:@"name"];
    
                // 编码完成
                [archiver finishEncoding];
    
            // 将存档的数据写入文件
            BOOL bl = [achiverDataArea writeToFile:achiverPath atomically:YES];
    
        // 反归档,解码
    
            Cat *cat2 = [[Cat alloc] init];
    
            // 设置数据区域
            NSData *unarchiverDataArea = [NSData dataWithContentsOfFile:achiverPath];
    
            // 解码存储在归档文件中的对象
    
                // 将数据区域链接到 NSKeyedUnarchiver 对象
                NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverDataArea];
    
                // 解码
                cat2.name = [unarchiver decodeObjectForKey:@"name"];
    
                // 解码完成
                [unarchiver finishDecoding];
时间: 2024-09-08 10:32:26

iOS - OC NSKeyedArchiver 数据归档的相关文章

iOS - Swift NSKeyedArchiver 数据归档

前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象.通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 ini

iOS - OC PList 数据存储

前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码.一般可以使用属性列表文件存储 NSArray 或者 NSDictionary 之类的数据,这种 "属性列表文件" 的扩展名是 plist,因此也称为 "plist 文件". plist 是以 xml 文件形式存储的. 如

iOS - OC NSData 数据

前言 @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSMutableData : NSData NSData 和它的可变长子类 NSMutableData 是字节缓冲区的对象化封装.我们可以获得简单缓冲区,并进行一些转换操作.通常我们并不会直接创建字节数据,而是从其他类型的内容转换成字节数据. 所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针. 对于 32 位应用程

iOS - OC NSUserDefaults 数据存储

前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults 里存了一个可变数组,取出来的时候这个数组对象就变成了不可变的. NSUserDefaults 可以存储的数据类型包括:NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary.如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefaul

iOS开发之数据存储之NSKeyedArchiver

1.概述 NSKeyedArchiver归档和plist文件存储不同的是NSKeyedArchiver可以直接保存对象.如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以被存储. NSCoding协议中的2个方法: (1)encodeWithCoder: 存对象时该方法必须实现,每次归档对象时,都会

iOS - OC Foundation 框架

前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 Foundation .Core Data 和 AppKit(Application Kit)框架.用于 Mac OS X 设备上的应用程序开发. Cocoa Touch :是指 Foundation .Core Data 和 UIKit 框架.用于 iOS 设备上的应用程序开发. 1.Found

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

IOS中JSON数据的解析

IOS中JSON数据解析 官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法: + (BOOL)isValidJSONObject:(id)obj; 判断一个数据对象是否可以转化为JSON数据 + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error; 将JSON数据写为NSData数据,其中opt参数