iOS - OC NSKeyedArchiver 数据归档

简介: 前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。

前言

    @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];
目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
222 4
|
8月前
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
74 1
|
5月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
8月前
|
Java iOS开发
iOS的数据序列化(又称持久化)的两类使用方式
iOS的数据序列化(又称持久化)的两类使用方式
78 0
|
8月前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
396 1
|
8月前
|
Web App开发 网络安全 Android开发
🚀2023最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包
在移动应用程序的开发中,了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法,可以让我们分析应用程序的网络请求和响应,了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具,可以帮助我们在 Android 和 iOS 平台上进行数据抓包。本篇博客将介绍如何使用克魔助手在 iOS 平台上进行数据抓包。
|
8月前
|
Java 开发工具 Android开发
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
本文介绍了使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践。
517 7
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
24天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
118 66