• 所谓归档:将复杂对象转化为NSData类型数据(复杂-->归档-->NSData--->WriteToFile)
    注意:归档是将对象转化为数据字节,以文件的形式存储在磁盘上,
  • 所谓反归档:将NSData类型数据转化为复杂对象(读取文件-->NSData-->反归档--->复杂对象)


    再说归档之前,先说下iOS的数据持久化方式:
    那么问题来了,什么是数据持久化?

    数据持久化(侠义的理解):仅仅指把域对象永久保存到数据库中,(广义的理解):包括和数据库相关的各种操作
    优点:
    1:数据持久化可以减少访问数据库数据的次数,增加应用程序执行的速度;
    2:代码重用性高,能够完成大部分数据库操作;
    3:低耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需要修改配置文件而不用修改代码

那么iOS的数据化持久方式有哪些呢?

1:属性列表(Plist文件),NSUserDefault
2:归档(NSKeyedArchiver)
3:数据库(SQlite,CoreData,FMDB(第三方))


今天重点说下归档和结档的问题
归档的三种方式:

1:对foundation框架的对象进行归档
2:对自定义的对象进行归档
3:对自定义内容进行归档
注意:归档生成的文件是加密的


下边举简单的例子分别说下归档的三种方式

#pragma mark---对自定义对象进行归档反归档----
- (void)archive{
//先创建一个Person类
/*第一:复杂对象所属的类一定要遵循NSCoding协议第二:实现协议中的方法- (void)encodeWithCoder:(NSCoder *)aCoder;- (instancetype)initWithCoder:(NSCoder *)aDecoder;
//归档(由叫序列化)的步骤
//对Person类对象进行归档时执行此方法.并对Person类中想要进行归档的所有属性,进行序列化操作- (void)encodeWithCoder:(NSCoder *)aCoder{[aCoder encodeObject:_name forKey:@"name"];[aCoder encodeObject:_gender forKey:@"gender"];[aCoder encodeObject:_age forKey:@"age"];
}//反归档(由叫反序列化)的步骤
//对Person类对象进行反归档时执行此方法.并对Person类中想要进行反归档的所有属性,进行反序列化操作
- (instancetype)initWithCoder:(NSCoder *)aDecoder{if (self = [super init]) {_name = [aDecoder decodeObjectForKey:@"name"];_gender = [aDecoder decodeObjectForKey:@"gender"];_age = [aDecoder decodeObjectForKey:@"age"];}return self;}*/person *per = [person new];per.name = @"甲甲";per.age = @"20";per.gender = @"女";//归档//1:准备路径NSString *path = NSHomeDirectory();path = [path stringByAppendingString:@"Singel.plist"];//2:准备存储数据对象(用可变数组进行接收)NSMutableData *data = [NSMutableData new];//3:创建归档对象NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];//4:开始归档[archiver encodeObject:per forKey:@"person"];//5:完成归档[archiver finishEncoding];//6:写入文件BOOL result = [data writeToFile:path atomically:YES];if (result) {NSLog(@"归档成功:%@",path);}//反归档//1:获取解档路径NSData *MyData = [NSData dataWithContentsOfFile:path];//2:创建反归档对象NSKeyedUnarchiver  *unarchiver= [[NSKeyedUnarchiver alloc]initForReadingWithData:MyData];//3:反归档person *aper = [person new];aper = [unarchiver decodeObjectForKey:@"person"];//4:结束归档[unarchiver finishDecoding];NSLog(@"%@",aper.name);
}
#pragma mark----对foundation框架中的对象进行归档和反归档
- (void)fundationClass{
//归档//1:创建路径NSString *Doucuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];NSString *path = [Doucuments stringByAppendingString:@"file.plist"];//2:归档(不需要结束方法)NSArray *array = @[@"jiajia",@"jiejie",@"pangpang"];BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path];if (result) {NSLog(@"框架中的归档%@",path);}//反归档NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];NSLog(@"框架的结档%@",newArray);
}
#pragma mark----对自定义的内容进行归档和反归档
- (void)customContent{
//归档//1:获取路径NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];path = [path stringByAppendingString:@"custom.plist"];NSMutableData *data = [NSMutableData data];NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];[archiver encodeObject:@"111" forKey:@"name"];[archiver encodeObject:@"2" forKey:@"gender"];[archiver encodeObject:@"100" forKey:@"age"];[archiver finishEncoding];BOOL result = [data writeToFile:path atomically:YES];if (result) {NSLog(@"归档%@",path);}NSData *newdata = [NSData dataWithContentsOfFile:path];NSKeyedUnarchiver *unkeyed =  [[NSKeyedUnarchiver alloc]initForReadingWithData:newdata];
//    NSString *str1 = [unkeyed decodeObjectForKey:@"name"];
//    NSString *str2 = [unkeyed decodeObjectForKey:@"gender"];
//    NSString *str3 = [unkeyed decodeObjectForKey:@"age"];person *pp = [person new];pp.name = [unkeyed decodeObjectForKey:@"name"];pp.gender = [unkeyed decodeObjectForKey:@"gender"];pp.age = [unkeyed decodeObjectForKey:@"age"];[unkeyed finishDecoding];NSLog(@"name:%@ gender:%@ age:%@",pp.name,pp.gender,pp.age);
//    NSLog(@"name:%@ gender:%@ age:%@",str1,str2,str3);

}

文/钎探穗(简书作者)
原文链接:http://www.jianshu.com/p/df801df8169e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS 数据持久化方式 - 归档 反归档相关推荐

  1. 【iOS数据持久化】Plist使用

    iOS数据持久化Plist使用 iOS 端数据持久化就是把数据保存在本地,常用于基本信息储存,应用配置,应用支持数据源,网络请求缓存等.主要有如下几种方式: 方式 介绍 特点 Plist文件 属性列表 ...

  2. 四种数据持久化方式(上) :属性列表与归档解档

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹. iOS开发中 ...

  3. iOS归档 反归档 Archiving Unarchiver

    Archiving: 归档 支持的类型:只要遵守NSCoding协议的对象都可以使用归档 归档步骤(写) a. 准备可变数据对象NSMutableData NSMutableData *mutable ...

  4. iOS数据持久化方案

    技术由来 数据持久化是iOS开发中必不可少的一项技能.因为开发中我们多会涉及到用户信息存储.文件存储.应用内容缓存中的一个或者几个场景. 数据持久化的几种方式 NSUserDefaults plist ...

  5. 【iOS数据持久化】数据库(SQLite.swift)和FMDB

    数据持久化之SQLite数据库(SQLite.swift使用) 一.     简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了.它的处理速 ...

  6. iOS 数据持久化 -- Core Data (2)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...

  7. 【iOS数据持久化】偏好设置(UserDefaults)

    官网文档:NSUserDufaultClass Reference 关于偏好设置:AboutPreferences and Settings UserDefualts是一种便利的,通过key-valu ...

  8. iOS - 数据持久化之 FMDB 的使用

    前言 上一篇文章「iOS - 使用 SQLite 数据库实现数据持久化」,介绍了如何使用 sqlite3 操作 SQLite 数据库实现增删改查.但是在代码编写的过程中,我们发现 sqlite3 需要 ...

  9. redis的基本操作And数据持久化方式以及redis实现mybatis缓存

    Redis 1.NoSql # NoSql(Not Only Sql),不仅仅是sql,泛指非关系型数据库 2.NoSql的诞生 随着互联网web2.0网站的兴起,传统的关系型数据库在高并发和特大规模 ...

最新文章

  1. HTTP协议之http状态码详解
  2. 强化学习(part1)--概述
  3. 一个使用:focus-within伪类实现的button选中动画效果
  4. 如何保护你的linux操作系统
  5. 配置中文_星球大战:战机中队配置需求公布 支持中文
  6. ZooKeeper編程02--多線程的分佈式鎖
  7. 分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】
  8. 新能源界首陷“漏电门”奥迪将召回1644辆电动车e-tron
  9. 【ElasticSearch】Es 源码之 GatewayModule GatewayService 源码解读
  10. elman神经网络 python实现_Rust 能取代 Python,更好的实现神经网络?
  11. 有人说清华本科含金量最高,研究生的含金量就低了,这是为什么?
  12. jquery楼层效果
  13. Spark算子:RDD基本转换操作(2)–coalesce、repartition
  14. 【计算机网络】计算机网络笔记-韩立刚老师
  15. 运用递归来画谢尔宾斯基三角形
  16. 3D Motion Capture(3D运动捕捉)
  17. 如何把Word文档中的数字和字母变成新罗马字体?
  18. .net core增强工作流组件,基于稳定平台,多项目整合开发
  19. Typora怎么插入图片链接,并设置图片居中
  20. Mac恢复被修改的文档

热门文章

  1. ant编译错误:不再支持源选项 1.5,请使用 1.6 或更高版本。
  2. JDK8新特性01-Lambda表达式
  3. 菜鸟窝出品】数据清洗、python与sklearn数据标准化实战(附项目源码)
  4. 微信朋友圈分享链接调用外部浏览器打开指定URL链接是如何实现的
  5. 【数据库】数据库管理系统(Database Management Systems)
  6. Python的生成器和迭代器
  7. TED | 深度拖延症患者的自白(附视频演讲稿)
  8. 一个笔记本能连WiFi 通过网线共享网络给另一个电脑上网(笔记本对台式/笔记本对笔记本)
  9. 服务降级--服务降级的一点认识
  10. 独立开发变现周刊(第81期):开发一个应用来减少屏幕使用时间,月收入2万美元...