NSKeyedArchiver

前言

  • 在 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、自定义类的归档和反归档

  • 2.1 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
  • 2.2 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
  • 2.3 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 序列化

  • 3.1 main.m

// Cat 类不需要遵守 NSCoding 协议,也不需要其协议方法
#importCat.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];
posted @   CH520  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示
哥伦布
08:13发布
哥伦布
08:13发布
2°
西北风
4级
空气质量
相对湿度
89%
今天
小雪
0°/6°
周日
2°/12°
周一
4°/15°