当前位置:网站首页>OC-归档(序列化)(了解的不多 没细看)
OC-归档(序列化)(了解的不多 没细看)
2022-08-04 21:37:00 【彭同学她同桌】
IOS的本地存储:plist属性列表(Property List),归档,sqlite,coredata
什么是归档
归档就是将对象打包成二进制序列
归档的作用
归档可以将程序中使用的多个对象及其属性值,以及他们的相互关系保存到文件中 或者发送给另一个进程
简单点说就是将对象以对象的形式存储在文件中 并且还可以以对象的形式从文件中拿出来
够可以将相互关联的多个对象归档为二进制文件,
NSCoding协议
归档需要先引入<NSCoding>协议
@protovol NSCoding
-(void)encodeWithCoder:(NSCoder*)aCoder;
-(id)initWithCoder:(NSCoder*)aDecoder;
@end
NSCoder 是一个抽象类 NSKeyedArchiver和NSKeyedUnarchiver是NSCoder的子类
NSCoder就相当于一个二进制空间
NSCoder的实例成为归档器
-(void)encodeWithCoder:(NSCoder*)aCode//指定对象归档规则
-(void)encodeWithCoder:(NSCoder*)aCode
{
//如果父类适用于NSCoding协议 则super也需要调用
//[super encoderWithCoder:aCoder];
[coder encodeObject:/*归档变量*/ forKey:/*归档名称*/];
[coder encodeObject:self.name forKey:@"name"];
}
-(id)initWithCoder:(NSCoder*)aDecoder//指定对象解档规则
//如果父类适用NSCoding协议 则
//self = [super initWithCoder:aDecoder];
//如果父类不适用则调用
//self = [super init];
接收变量 = [coder decodeObjectForKey:/*归档名称*/];
self.name = [coder decodeObjectForKey:@"name"];
NSKeyedArchiver archiveRootObject:toFile: //对目标对象进行归档
[NSKeyedArchiver archiveRootObject:归档对象 toFile:归档目标路径]
[NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"]
NSKeyedUnarchiver unarchiveObjectWithFile://通过解档目标文件初始化对象
A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:目标文件路径];
A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];
(id) initForWritingwithMutableData:(NSMutableData*)data
多对象的
将预先生成的NSMuable实例作为参数 初始化NSkeyedArchiver实例 这个data的数据会被保留 最后作为归档
NSMutableData *data = [NSMutableData data];//创建一个data对象
//根据二进制流创建NSKeyedArchiver对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//感觉可能是将在archiver和data之间创建一个二进制流
[archiver encodeObject:a forKey:@“a”];
[archiver encodeObject:aa forKey:@“aa”];
实例
dog.h
@interface Dog : NSObject<NSCoding>
@property (nonatomic,copy)NSString* name;
@end
dog.m
#import "dog.h"
@implementation Dog
-(void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
}
-(nullable instancetype)initWithCoder:(NSCoder *)coder
{
if(self = [super init])
{
self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}
@end
main.m
//
// main.m
// OCTest
//
// Created by Renkai Yang on 2022/7/26.
//
#import <Foundation/Foundation.h>
#import "dog.h"
@interface A:NSObject<NSCoding>
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)int age;
@property (nonatomic,assign)double weight;
@property (nonatomic,strong)Dog*dog;
@end
@implementation A
-(void)encodeWithCoder:(NSCoder *)coder//设定归档规则
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInt:self.age forKey:@"age"];
[coder encodeDouble:self.weight forKey:@"weight"];
[coder encodeObject:self.dog forKey:@"dog"];//如果要给自定义类归档解档 就需要在自定义类中制定归档解档规则
}
-(nullable instancetype)initWithCoder:(NSCoder *)coder//设定解挡规则
{
if(self = [super init])//这里要初始化主要是用来给新对象初始化
{
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntForKey:@"age"];
self.weight = [coder decodeDoubleForKey:@"weight"];
self.dog = [coder decodeObjectForKey:@"dog"];
}
return self;
}
@end
void test()//进行归档操作
{
A *a = [[A alloc]init];
a.name = @"Yang";
a.age = 23;
a.weight = 58.0;
a.dog = [[Dog alloc]init];
a.dog.name = @"大黄";
NSLog(@"归档开始");
if([NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"])//将a对象归档到指定文件中
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
test();
A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];//通过解档文件对a进行初始化
NSLog(@"%@",a.name);
NSLog(@"%d",a.age);
NSLog(@"%f",a.weight);
NSLog(@"%@",a.dog.name);
}
return 0;
}
多对象归档
dog.h
@interface Dog : NSObject<NSCoding>
@property (nonatomic,copy)NSString* name;
@end
dog.m
#import "dog.h"
@implementation Dog
-(void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
}
-(nullable instancetype)initWithCoder:(NSCoder *)coder
{
if(self = [super init])
{
self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}
@end
main.m
//
// main.m
// OCTest
//
// Created by Renkai Yang on 2022/7/26.
//
#import <Foundation/Foundation.h>
#import "dog.h"
@interface A:NSObject<NSCoding>
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)int age;
@property (nonatomic,assign)double weight;
@property (nonatomic,strong)Dog*dog;
@end
@implementation A
-(void)encodeWithCoder:(NSCoder *)coder//设定归档规则
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInt:self.age forKey:@"age"];
[coder encodeDouble:self.weight forKey:@"weight"];
[coder encodeObject:self.dog forKey:@"dog"];//如果要给自定义类归档解档 就需要在自定义类中制定归档解档规则
}
-(nullable instancetype)initWithCoder:(NSCoder *)coder//设定解挡规则
{
if(self = [super init])//这里要初始化主要是用来给新对象初始化
{
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntForKey:@"age"];
self.weight = [coder decodeDoubleForKey:@"weight"];
self.dog = [coder decodeObjectForKey:@"dog"];
}
return self;
}
@end
void test()
{
A *a = [[A alloc]init];
a.name = @"a";
a.age = 23;
a.weight = 58.0;
a.dog = [[Dog alloc]init];
a.dog.name = @"大黄";
A *aa = [[A alloc]init];
aa.name = @"aa";
aa.age = 22;
aa.weight = 57.0;
aa.dog = [[Dog alloc]init];
aa.dog.name = @"大黄1";
NSLog(@"多对象归档开始");
NSMutableData *data = [NSMutableData data];
//根据二进制流创建NSKeyedArchiver对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//对对象进行归档
[archiver encodeObject:a forKey:@"a"];
[archiver encodeObject:aa forKey:@"aa"];
//结束归档
[archiver finishEncoding];
//将二进制流写入文件
if([data writeToFile:@"/Users/RenkaiYang/Desktop/archive/test.txt" atomically:YES])//将a对象归档到指定文件中
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
// NSLog(@"归档开始");
//这里是调用NSKeyedArchiver的对象方法archiveRootObject
// if([NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"])//将a对象归档到指定文件中
// {
// NSLog(@"归档成功");
// }
// else
// {
// NSLog(@"归档失败");
// }
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
test();
// //单对象解档
// A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];//通过解档文件对a进行初始化
// NSLog(@"%@",a.name);
// NSLog(@"%d",a.age);
// NSLog(@"%f",a.weight);
// NSLog(@"%@",a.dog.name);
//多对象解档
NSData* data = [NSData dataWithContentsOfFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
A *a1 = [unarchiver decodeObjectForKey:@"a"];
A *a2 = [unarchiver decodeObjectForKey:@"aa"];
NSLog(@"a1:%@",a1.name);
NSLog(@"a1:%d",a1.age);
NSLog(@"a1:%f",a1.weight);
NSLog(@"a1:%@",a1.dog.name);
NSLog(@"a2:%@",a2.name);
NSLog(@"a2:%d",a2.age);
NSLog(@"a2:%f",a2.weight);
NSLog(@"a2:%@",a2.dog.name);
}
return 0;
}
边栏推荐
- LayaBox---TypeScript---结构
- Re24:读论文 IOT-Match Explainable Legal Case Matching via Inverse Optimal Transport-based Rationale Ext
- 七夕特制:《牛郎会织女》
- DGL安装教程
- 国内的PMP证书含金量到底如何
- Spss-一元回归实操
- y87.第五章 分布式链路追踪系统 -- 分布式链路追踪系统起源(一)
- PyTorch Geometric (PyG) 安装教程
- DSPE-PEG-Aldehyde, DSPE-PEG-CHO, Phospholipid-Polyethylene Glycol-Aldehyde A hydrophobic 18-carbon phospholipid
- 数字重塑客观世界,全空间GIS发展正当其时
猜你喜欢

Codeforces Round #811 (Div. 3)

数电快速入门(五)(编码器的介绍以及通用编码器74LS148和74LS147的介绍)

PowerCLi 批量配置NTP

unity2D横版游戏教程8-音效

stm32mp157系统移植 | 移植ST官方5.10内核到小熊派开发板

In action: 10 ways to implement delayed tasks, with code!

数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)

动手学深度学习_NiN

基于 Milvus 和 ResNet50 的图像搜索(部署及应用)

Zynq Fpga图像处理之AXI接口应用——axi_lite接口使用
随机推荐
国内的PMP证书含金量到底如何
PyTorch Geometric (PyG) 安装教程
【线性代数03】消元法展示以及AX=b的4种解情况
基于声卡实现的音频存储示波器,可作为电磁学实验的测量仪表
打卡第 1 天:正则表达式学习总结
Re24:读论文 IOT-Match Explainable Legal Case Matching via Inverse Optimal Transport-based Rationale Ext
stm32mp157系统移植 | 移植ST官方5.10内核到小熊派开发板
2022年江苏省大学生电子设计竞赛(TI杯)B题 飞机 省级一等奖记录 “一个摆烂人的独白”
用Tesseract开发一个你自己的文字识别应用
ES6高级-Promise的用法
1319_STM32F103串口BootLoader移植
Chapter7 : Network-Driven Drug Discovery
proe和creo的区别有哪些
PowerCLi batch configuration of NTP
unity2D横版游戏教程8-音效
数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
milvus配置相关
docker 部署redis集群
SPSS-System Clustering Software Practice
LayaBox---TypeScript---Problems encountered at first contact