归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),浏览网上的一些资料后,并结合自己的一些经验,总结成此文。

一、使用archiveRootObject进行简单的归档

使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行接档,这种方式会在写入、读出数据之前对数据进行序列化、反序列化操作。

归档:

  1. NSString *homeDictionary = NSHomeDirectory();//获取根目录
  2. NSString *homePath  = [homeDictionary stringByAppendingPathComponent:@"atany.archiver"];//添加储存的文件名
  3. BOOL flag = [NSKeyedArchiver archiveRootObject:@”归档” toFile:homePath];//归档一个字符串

这种方式可以对字符串、数字等进行归档,当然也可以对NSArray与NSDictionary进行归档。返回值Flag标志着是否归档成功,YES为成功,NO为失败。

接档:

  1. [NSKeyedUnarchiver unarchiveObjectWithFile:homePath]

使用NSKeyedUnarchiver进行接档(反序列化)。

这种归档的方式存在一个缺点:只能把一个对象归档进一个文件中,那么怎么对多个对象进行归档呢?

二、对多个对象的归档

同样是使用NSKeyedArchiver进行归档,不同的是同时归档多个对象,这里我们举例放入了一个CGPoint点、字符串、整数(当然很多类型都可以的,例如UIImage、float等等),使用encodeXXX方法进行归档,最后通过writeToFile方法写入文件。

归档:写入数据

  1. //准备数据
  2. CGPoint point = CGPointMake(1.0, 2.0);
  3. NSString *info = @"坐标原点";
  4. NSInteger value = 10;
  5. NSString *multiHomePath = [NSHomeDirectory() stringByAppendingPathComponent:@"multi.archiver"];
  6. NSMutableData *data = [[NSMutableData alloc]init];
  7. NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
  8. //对多个对象进行归档
  9. [archvier encodeCGPoint:point forKey:@"kPoint"];
  10. [archvier encodeObject:info forKey:@"kInfo"];
  11. [archvier encodeInteger:value forKey:@"kValue"];
  12. [archvier finishEncoding];
  13. [data writeToFile:multiHomePath atomically:YES];

接档:从路径中获得数据构造NSKeyedUnarchiver实例,使用decodeXXXForKey方法获得文件中的对象。

  1. NSMutableData *dataR = [[NSMutableData alloc]initWithContentsOfFile:multiHomePath];
  2. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:dateR];
  3. CGPoint pointR = [unarchiver decodeCGPointForKey:@"kPoint"];
  4. NSString *infoR = [unarchiver decodeObjectForKey:@"kInfo"];
  5. NSInteger valueR = [unarchiver decodeIntegerForKey:@"kValue"];
  6. [unarchiver finishDecoding];
  7. NSLog(@"%f,%f,%@,%d",pointR.x,pointR.y,infoR,valueR);

可以看出对多个对象进行归档还是挺方便的,这里又出现一个问题,这里的对象都是基本类型数据,那么怎么对自己定义类生成的实例对象进行归档呢?

三、对自定义对象进行归档

自定义对象,应用范围很广,因为它对应着MVC中的Model层,即实体类。在程序中,我们会在Model层定义很多的entity,例如User,Teacher。。

那么对自定义对象的归档显得重要的多,因为很多情况下我们需要在Home键之后保存数据,在程序恢复时重新加载,那么,归档便是一个好的选择。

首先我们需要,自定义一个实体类,Archive。

Archive.h

  1. #import <Foundation/Foundation.h>
  2. @interface Archive : NSObject
  3. @property (copy,nonatomic) NSString *name;
  4. @property NSInteger age;
  5. @property (copy,nonatomic) NSString *address;
  6. @property (copy,nonatomic) UIImage *photo;
  7. @end

Archive.m

  1. #import "Archive.h"
  2. #define kNameKey @"NameKey"
  3. #define kAgeKey @"AgeKey"
  4. #define kAddress @"AddressKey"
  5. #define kPhotoKey @"PhotoKey"
  6. @implementation Archive
  7. @synthesize name = _name;
  8. @synthesize age = _age;
  9. @synthesize address = _address;
  10. @synthesize photo = _photo;
  11. #pragma mark - NSCoding
  12. - (void)encodeWithCoder:(NSCoder *)aCoder {
  13. [aCoder encodeObject:_name forKey:kNameKey];
  14. [aCoder encodeInteger:_age forKey:kAgeKey];
  15. [aCoder encodeObject:_address forKey:kAddress];
  16. [aCoder encodeObject:_photo forKey:kPhotoKey];
  17. }
  18. - (id)initWithCoder:(NSCoder *)aDecoder {
  19. if (self = [super init]) {
  20. _name = [aDecoder decodeObjectForKey:kNameKey];
  21. _age = [aDecoder decodeIntegerForKey:kAgeKey];
  22. _address = [aDecoder decodeObjectForKey:kAddress];
  23. _photo = [aDecoder decodeObjectForKey:kPhotoKey];
  24. }
  25. return self;
  26. }
  27. #pragma mark - NSCoping
  28. - (id)copyWithZone:(NSZone *)zone {
  29. Archive *copy = [[[self class] allocWithZone:zone] init];
  30. copy.name = [self.name copyWithZone:zone];
  31. copy.age = self.age;
  32. copy.address = [self.address copyWithZone:zone];
  33. copy.photo = self.photo;
  34. return copy;
  35. }
  36. @end

Archive类有四个字段(名字、年纪、地址、头像),除了年纪为整型之外,其他的都看作Object。

【注】:要将一个自定义的类进行归档,那么类里面的每个属性都必须是可以被归档的,如果是不能归档的类型,我们可以把他转化为NSValue进行归档,然后在读出来的时候在转化为相应的类。

Archive实现了三个委托方法1)encodeWithCoder: 2)initWithCoder:  3)copyWithZone:

1)encodeWithCoder

Encodes the receiverusing a given archiver

通过一个给定的archiver把消息接收者进行编码。

当接收到encodeObject消息的时候,类终端encodeWithCoder方法被调用。

2)initWithCoder

Returns an objectinitialized from data in a given unarchiver. (required)

从一个给定unarchiver的数据中返回一个初始化对象。

3)copyWithZone

Returnsa new instance that’s a copy of the receiver

返回消息接收者的一个复制的新实例。

SDK的概念就是这样,下面看看这个自定义类归档的具体代码,其实和多个对象的归档是一样的。。。

归档:

  1. //保存图片与归档
  2. - (IBAction)save:(id)sender {
  3. //准备数据
  4. NSString *name = @"小杨在玩iOS";
  5. NSInteger age = 22;
  6. NSString *address = @"你猜我在哪~";
  7. UIImage *photo = [UIImage imageNamed:@"loginman.jpg"];
  8. //存储数据到类
  9. Archive *archivingData = [[Archive alloc] init];
  10. archivingData.name = name;
  11. archivingData.age = age;
  12. archivingData.address = address;
  13. archivingData.photo = photo;
  14. //归档
  15. NSMutableData *data = [[NSMutableData alloc] init];
  16. NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  17. [archiver encodeObject:archivingData forKey:kArchivingDataKey]; // archivingDate的encodeWithCoder
  18. 方法被调用
  19. [archiver finishEncoding];
  20. //写入文件
  21. [data writeToFile:self.archivingFilePath atomically:YES];
  22. }

接档:

  1. - (IBAction)loadArchive:(id)sender {
  2. NSData *data = [[NSMutableData alloc] initWithContentsOfFile:self.archivingFilePath];
  3. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
  4. //获得类
  5. Archive *archivingData = [unarchiver decodeObjectForKey:kArchivingDataKey];// initWithCoder方法被调用
  6. [unarchiver finishDecoding];
  7. //读取的数据
  8. NSString *name = archivingData.name;
  9. NSInteger age = archivingData.age;
  10. NSString *address = archivingData.address;
  11. self.imageView.image = archivingData.photo;
  12. NSLog(@"%@||%d||%@",name,age,address);
  13. }

我们save之后loadArchive一次

打出结果为:

2013-11-04 19:29:41.743TestArchives[16708:c07]小杨在玩iOS||22||你猜我在哪~

获取成功。

iOS archive(归档)的更多相关文章

  1. iOS archive(归档)的总结 (序列化和反序列化,持久化到文件)

    http://www.cnblogs.com/ios8/p/ios-archive.html

  2. iOS archive(归档)的总结

    http://www.cnblogs.com/ios8/p/ios-archive.html

  3. iOS中归档对象的创建,数据写入与读取

    归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型.专门编写用于保存数据的任何模型对象都应该支持归档.比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对 ...

  4. Hadoop的Archive归档命令使用指南

    hadoop不适合小文件的存储,小文件本省就占用了很多的metadata,就会造成namenode越来越大.Hadoop Archives的出现视为了缓解大量小文件消耗namenode内存的问题. 采 ...

  5. ios之归档demo

    ios对自定义对象的归档.首先需要实现NSCoding与NSCopying接口 #import <Foundation/Foundation.h> @interface Person : ...

  6. iOS 数据归档----温故而知新

    #import "StudyViewController.h" #import "person.h" @interface StudyViewControlle ...

  7. iOS archiveRootObject 归档失败问题

    归档失败问题出在路径上,NSHomeDirectory() NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocument ...

  8. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  9. IOS数据存储之归档/解档

    前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...

随机推荐

  1. 【BZOJ】【2850】【Violet 0】巧克力王国

    KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...

  2. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  3. socket函数send和recv函数

    转自:http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html 在发送端,一次发送4092个字节,在接收端,一次接收4092个字节,但是 ...

  4. uva 10160 Servicing Stations(DFS+剪枝)

    Servicing stations A company offers personal computers for sale in N towns (3 <= N <= 35). The ...

  5. Best Time to Buy and Sell Stock leetcode java

    题目: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...

  6. Unity3D游戏开发最佳实践20技巧(三)

    [文本] 38.假设你有非常多的剧情文本.那么把他们放到一个文件中面. 不要把他们放到Inspector的字段中去编辑. 这些须要做到不打开Unity,也不用保存Scene就能够方便的改动. 39.假 ...

  7. Mysql创建多列唯一索引Sql

    ALTER TABLE `t_city_combo` ADD UNIQUE INDEX ` t_city_combo_index` (`combo_id`, `combo_name`, `city_i ...

  8. 经典,HTML5游戏,超级玛丽

    在线演示 在线演示 本地下载 这是一款使用HTML5开发的超级玛丽,有没有点儿时的记忆?长按向上键,可以跳的更高哦.如果你也喜欢可以当成休闲游戏,如果你是开发者,不防下载下来看看是如何生成的.

  9. 单点登录(SSO)(原创)

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 下面的sso ...

  10. Java总结:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...