iOS:文件归档和解归档的详解和使用
文件归档和解归档:
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档
+ (id)unarchiveObjectWithFile:(NSString *)path;//接归档
2、NSKeyedArchiver 归档、解归档(自定义的对象,必须要实现<NSCoding>协议)
- (void)encodeWithCoder:(NSCoder *)aCoder;//归档的协议方法,序列化
- (id)initWithCoder:(NSCoder *)aDecoder;//解归档的协议方法,反序列化
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档
+ (id)unarchiveObjectWithFile:(NSString *)path;//接归档
3、对多个对象进行归档、解归档
- (instancetype)initForWritingWithMutableData:(NSMutableData *)data;//用一个可变的data创建归档对象
- (void)encodeObject:(id)objv forKey:(NSString *)key;//将对象归档
- (void)finishDecoding//完成归档(必须执行)
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile//将数据写进归档文件中
- (instancetype)initForReadingWithData:(NSData *)data;//用一个data创建解归档对象,这个data由文件中获取而来
- (id)decodeObjectForKey:(NSString *)key;//解归档
文件归档和解归档的使用:
一、对内置单个对象进行归档和解归档
1.获取归档文件的路径(归档文件名可以自己随意取名)
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [documents lastObject]; NSString *archiveFileName = [documentPath stringByAppendingPathComponent:@"array.arc"];
2.准备归档的对象数据
NSArray *array = @[@,@,@,@,@,@];
3.对数据进行归档(根据flag标识进行判断,如果返回的是YES,归档成功;反之,归档失败)
if([NSKeyedArchiver archiveRootObject:array toFile:archiveFileName]) { NSLog(@"归档对象成功"); }
4.对数据进行解归档
NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFileName];
二、对自定义的单个对象进行归档和解归档(由于自定义对象不具有归档的性质,所以要实现归档和解归档,首先必须实现<NSCoding>协议)
1.自定义一个归档对象类,实现协议
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@property (assign,nonatomic)char gender;
-(id)initWithName:(NSString*)name andAge:(NSInteger)age andChar:(char)gender;
@end
Person.m
#import "Person.h"
@implementation Person
-(id)initWithName:(NSString*)name andAge:(NSInteger)age andChar:(char)gender
{
self = [super init];
if(self)
{
_name = [name copy];
_age = age;
_gender = gender;
}
return self;
}
-(NSString*)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%c",_name,_age,_gender];
}
#pragma mark -<NSCoding>
//归档的协议方法
-(void)encodeWithCoder:(NSCoder *)aCoder//将归档对象序列化
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
[aCoder encodeInt:_gender forKey:@"gender"];
}
//解归档的协议方法
-(id)initWithCoder:(NSCoder *)aDecoder //将归档对象反序列化
{
self = [super init];
if(self)
{
_name = [[aDecoder decodeObjectForKey:@"name"] copy];
_age = [aDecoder decodeIntegerForKey:@"age"];
_gender = [aDecoder decodeIntForKey:@"gender"];
}
return self;
}
@end
2.获取归档文件的路径(归档文件名可以自己随意取名)
1 NSString *homePath = NSHomeDirectory(); NSString *documentPath = [homePath stringByAppendingPathComponent:@"documents"]; NSString *arcviFileName = [documentPath stringByAppendingPathComponent:@"person.arc"];
3.创建该类归档对象并将其初始化
Person *person = [[Person alloc]initWithName:@"Tom" andAge: andChar:'M'];
4.将归档对象归档
if([NSKeyedArchiver archiveRootObject:person toFile:arcviFileName])
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
5.将归档的对象解归档
Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithFile:arcviFileName];
三、对多个对象进行归档和解归档(前面的两种方式都是针对于单个对象进行归档和解归档,如果需要对多个对象进行归档,它们就无用武之地了,局限性很大,因此,这里介绍一个新的归档方式,多对象归档和解归档)
1.获取的文件路径(归档文件名可以自己随意取名)
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documents lastObject];
NSString *archiveFileName = [documentPath stringByAppendingPathComponent:@"objects.arc"];
2.准备要归档的多个归档对象数据
NSString *useName = @"admin";
NSArray *scores = @[@,@,@90.5,@];
NSString *adress = @"北京市昌平区东三旗";
3.对归档对象进行归档
//归档多个对象(将多个对象读到data中)
//1.用一个可变的data对象创建归档对象
NSMutableData *data = [[NSMutableData alloc]init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //2.归档多个对象
[archiver encodeObject:useName forKey:@"userName"];
[archiver encodeObject:scores forKey:@"scores"];
[archiver encodeObject:adress forKey:@"adress"]; //3.完成归档(必须要实现的方法,要不然归档失败)
[archiver finishEncoding]; //4.将可变的data写进文件
[data writeToFile:archiveFileName atomically:YES]; 说明:这种归档方式,其实就是先将所有的要归档的对象先存入到一个可变的NSMutableData对象data中,然后通过data创建的归档对象将data的数据归档到归档文件中就是了。
4.将归档对象进行解归档
//解归档多个对象
//1.从文件中读出一个data
NSData *data2 = [NSData dataWithContentsOfFile:archiveFileName];
//2.由data创建解归档对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2]; //3.按照key解出多个对象
NSString *userName2 = [unarchiver decodeObjectForKey:@"userName"];
NSArray *scores2 = [unarchiver decodeObjectForKey:@"scores"];
NSString *adress2 = [unarchiver decodeObjectForKey:@"adress"]; NSLog(@"uesrName:%@,scores:%@,adress:%@",userName2,scores2,adress2);
说明:这种解归档方式,其实就是从归档文件先读取data,然后通过data创建解归档对象根据指定的键将多个对象都解归档出来就是了。
演示如下:
-- ::56.563 -一个文件多个归档[:] uesrName:admin,scores:(
,
,
"90.5", ),adress:北京市昌平区东三旗
iOS:文件归档和解归档的详解和使用的更多相关文章
- swift 之归档和解归档
swift 之归档和解归档 数据持久化的方式有很多种,归档是其中的一种,说起数据持久化的方式,iOS 中基本有以下几种方式:sqlite存储.coredata存储.UserDefault存储.归档.p ...
- 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
转自:http://blog.csdn.net/java886o/article/details/9046967 #import <Foundation/Foundation.h> #im ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- WebService核心文件【server-config.wsdd】详解及调用示例
WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...
- robots.txt文件配置和使用方法详解
robots.txt文件,提起这个概念,可能不少站长还很陌生:什么是robots.txt文件?robots.txt文件有什么作用?如何配置robots.txt文件?如何正确使用robots.txt文件 ...
- DOS文件转换成UNIX文件格式详解
转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...
- 转:关于将Java编译过的.class文件打成jar可执行文件/JAR详解
原文链接:关于将Java编译过的.class文件打成jar可执行文件/JAR详解 如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. ...
- 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)
一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...
- express文件上传中间件Multer详解
express文件上传中间件Multer详解 转载自:https://www.cnblogs.com/chengdabelief/p/6580874.html Express默认并不处理HTTP请 ...
随机推荐
- Codeforces Round #371 (Div. 1) D - Animals and Puzzle 二维ST表 + 二分
D - Animals and Puzzle #include<bits/stdc++.h> #define LL long long #define fi first #define s ...
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第3节:Spark架构设计(2)
三,深入RDD RDD本身是一个抽象类,具有很多具体的实现子类: RDD都会基于Partition进行计算: 默认的Partitioner如下所示: 其中HashPartitioner的文档说明如下: ...
- Sharepoint 2010 TimerJob重复
昨天被TimerJob困扰了一天.原因就是TimerJob当中会有一个Httpwebrequest GET请求一个Application Page进行一些操作(其中有一个操作是发送邮件).但是发现随机 ...
- 消息中间件ActiveMQ使用详解
消息中间件ActiveMQ使用详解 一.消息中间件的介绍 介绍 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成. 特点(作用) ...
- aop相关术语
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面的编程.并不是全部的AOP框架都是一样的.他们连接点模型的功能可能有强弱之分,有些可以字段,方法,构 ...
- Linux-数据库2
表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...
- Scrapy基础------css选择器基础
基本语法: * 选择所有节点 #container 选择id为container的节点 .container 选择所有class包含container的节点 li a 选取所有li 下所有a节点 ul ...
- stl upper_bound()
http://blog.csdn.net/niushuai666/article/details/6734650 upper_bound( a , b , k )返回有序升序序列[a,b)中能放下 ...
- [CCC 2018] 平衡树
题面在这里! 根据题目描述就可以直接模拟出一个暴力. 如果把前 n^(1/2) 的树的方案数先一遍 O(n^(3/4)) 暴力预处理出来(其实复杂度并到不了这个级别),然后把n带进来直接暴力算就行了. ...
- Problem G: 切煎饼
Description 王小二自夸刀工不错,有人放一张大的圆煎饼在砧板上,问他:饼不允许离开砧板,切100刀最多能切多少块? Input 多组测试数据,每组输入1个整数,代表切的刀数 Output 每 ...