当前位置:网站首页>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---Example
- PCBA scheme design - kitchen voice scale chip scheme
- 1319_STM32F103串口BootLoader移植
- LayaBox---TypeScript---结构
- MySQL查询为啥慢了?
- 拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
- AI/ML无线通信
- 可视化工作流引擎开发OA系统,让企业少花冤枉钱
- What does Xinchuang mean?Which industries are involved?Why develop Xinchuang?
猜你喜欢
随机推荐
LeetCode: 406. 根据身高重建队列
Exploration and Practice of Database Governance
【线性代数03】消元法展示以及AX=b的4种解情况
拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
CPU、内存、显卡等硬件因素也影响着你的深度学习模型性能
动手学深度学习_NiN
"Jianzhi offer" brush title classification
如何为Web3.0世界启动完美的DAO
y87.第五章 分布式链路追踪系统 -- 分布式链路追踪系统起源(一)
《剑指offer》刷题分类
DGL安装教程
PCBA方案设计——厨房语音秤芯片方案
deepstream多相机显示布局
stm32mp157系统移植 | 移植ST官方5.10内核到小熊派开发板
LocalDate时间日期包的用法
路由中的meta、params传参的一些问题(可传不可传,为空,搭配,点击传递多次参数报错)
搬走地下空间开发利用“绊脚石” 中地数码取得地下空间透明化技术突破
ES6高级-async的用法
openresty lua-resty-template页面静态化
Named routes, the role of name in components