当前位置:网站首页>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;
}
边栏推荐
- js data type, throttling/anti-shake, click event delegation optimization, transition animation
- 传奇服务器需要什么配置?传奇服务器租用价格表
- PCBA方案设计——厨房语音秤芯片方案
- laravel whereDoesntHave
- 拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
- ES6高级-Promise的用法
- unity2D横版游戏教程8-音效
- 用Tesseract开发一个你自己的文字识别应用
- 数电快速入门(五)(编码器的介绍以及通用编码器74LS148和74LS147的介绍)
- 信创是什么意思?涉及哪些行业?为什么要发展信创?
猜你喜欢

开发deepstram的自定义插件,使用gst-dseaxmple插件进行扩充,实现deepstream图像输出前的预处理,实现图像自定义绘制图(精四)

y87.第五章 分布式链路追踪系统 -- 分布式链路追踪系统起源(一)
Exploration and Practice of Database Governance

In which industries is the PMP certificate useful?

【线性代数03】消元法展示以及AX=b的4种解情况

C language knowledge (1) - overview of C language, data types

【CC3200AI 实验教程 1】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-开发环境搭建
![OD-Model [6]: YOLOv2](/img/3d/c81846ad0f20e055adf0192fbb8e07.png)
OD-Model [6]: YOLOv2

docker 搭建mysql 主从复制

MySQL查询为啥慢了?
随机推荐
Some problems with passing parameters of meta and params in routing (can be passed but not passed, empty, collocation, click to pass multiple parameters to report an error)
input事件中文触发多次问题研究php DEBUG
SPSS-unary regression practice
动手学深度学习_NiN
多个平台显示IP属地,必须大力推行互联网实名制
UDP通信
数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
Ramnit感染型病毒分析与处置
EasyGBS接入最新版海康摄像头后无法传递告警信息该如何解决?
【分布式】分布式ID生成策略
Spss-系统聚类软件实操
Win11如何开启Telnet客户端?
零基础都能拿捏的七夕浪漫代码,快去表白或去制造惊喜吧
LayaBox---knowledge point
如何一键重装win7系统?重装win7系统详细教程
打卡第 2 天: urllib简记
JWT actively checks whether the Token has expired
开发deepstram的自定义插件,使用gst-dseaxmple插件进行扩充,实现deepstream图像输出前的预处理,实现图像自定义绘制图(精四)
实战:10 种实现延迟任务的方法,附代码!
信创是什么意思?涉及哪些行业?为什么要发展信创?