一、概念

1.归档用于保存对象,包括被归档对象之间的各种相互关系或者依赖性。解档用于重建以前归档的对象与关系。在其它面向对象的语言中,一般使用术语"序列化"来描述归档解档模式。
2.归档的对象通常存储为二进制数据,可以在内存或者磁盘中读取,写入。不过在Cocoa中,也有一些对象使用XML文件进行归档和解档,比如NSArray,NSDictionary等等,这是Cocoa中关于归档解档模式的另一个体现。
3.实现归档和解档模式的关键是相关对象的处理。不管对象之间的关系有多复杂,归档中的每个对象在那个归档中只会编码一次,也就是说,如果许多归档的对象都引用相同的对象,则这个对象只会编码一次,这就最小化了归档所需的存储空间。
4.有条件的编码:在许多对象彼此相关但是并非所有关系都需要保留下来的情况下,可以有条件的选择只对某些对象进行归档。
二、Cocoa中的实现
1.NSCoding协议:
(1)当一个对象要实现归档解档操作,需要归档的对象必须要实现NSCoding协议。
(2)NSCoding协议包含两个方法:encodeWithCoder:,initWithCoder:。
(3)encodeWithCoder实现对象编码,initWithCoder实现对象解码。两个方法的参数是NSCoder类实例,是对象编码解码器,可以将实例对象的属性直接编码或者以key-value的方式编码,解码也一样。
    类似的方法如下(每种数据类型都有相关的方法支持):
    encodeObject:
    encodeObject:forKey:
    encodeInt:forKey:
    decodeObject
    decodeObjectForKey:
    decodeIntForKey:
(4)编码和解码是对象迭代的一个过程,可能encodeObject:ObjectA方法又会引起ObjectA的encodeWithCoder被调用。
(5)NSCoding实现示例:
- (void)encodeWithCoder:(NSCoder*)coder{    
    [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];  
    [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];  
    [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];  
    [coder encodeObject:self.friends forKey:k_FRIENDS];  
    [coder encodeObject:self.address forKey:k_ADDRESS];  
    [coder encodeObject:self.addresses forKey:k_userEntity_addresses];  
}    
 
- (id)initWithCoder:(NSCoder*)decoder{    
    if (self = [super init])  {  
        if (decoder == nil)  {  
           return self;
        }  
        self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];  
        self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];  
        self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];  
        self.friends = [decoder decodeObjectForKey:k_FRIENDS];  
        self.address = [decoder decodeObjectForKey:k_ADDRESS];  
        self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];  
    }  
    return self;  

2.归档和解档工具类:
NSKeyedArchiver用于归档相关对象,生成NSData;
NSKeyedUnarchiver用于解档对象,从NSData解码出对象。
3.NSKeyedArchiver和NSKeyedUnarchiver相关API:
(1)NSData *data = [NSKeyedArchiver archivedDataWithRootObject:objectA];
    NSObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:someData];
(2)Bool isSucc = [NSKeyedArchiver archiveRootObject:rootObject toFile:filePath];
    NSObject *object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
(3)以上两套API方便的实现单个对象的归档和解档,如果要将多个对象归档在一起,可以用以下API:
    
    归档:
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:objectA forKey:@"keyA"];
    [archiver encodeObject:objectB forKey:@"keyB"];
    [archiver encodeInt:3 forKey:@"keyC"];
    [archiver finishEncoding];
    [data writeToFile:filePath atomically:YES];
    [archiver release];
    [data release];
    解档:
    – initForReadingWithData:
    – decodeObjectForKey:
     finishDecoding
(4)NSKeyedArchiver有一个属性outputFormat,类型为NSPropertyListFormat,指定编码器的编码格式。有两个可用的值:NSPropertyListXMLFormat_v1_0 和 NSPropertyListBinaryFormat_v1_0。采用二进制的格式比采用文本的格式占用的空间小,读写速度高。

归档和解档-Archiver相关推荐

  1. ios基础之归档和解档

    ios基础之归档和解档 有些api函数已经不在支持了但是我先把之前的api学好,再学后来新出的api函数 系统选取最新的,ios系统也是最新的 // // Teacher.h // 22-归档解档 / ...

  2. c语言选择题库和解系,OC单个对象归档和解档关键类和方法名

    //  文件归档(一) //需要参数(归档对象.归档路径) //参数设置 NSArray *array=@[ @"hello",@"world",@{@&quo ...

  3. iOS--归档和解档(Archiver)、(UnArchiver)

    一.已有类型的归档和解档 首先来看一个简单的例子: //第一方式:归档对象//对象-->文件NSArray *array = [NSArray arrayWithObjects:@"z ...

  4. 【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)

    简介 归档(Archive)也称为序列化(serialization),把对象转化为字节码,以文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundatio ...

  5. OC学习篇之---归档和解挡

    今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些 ...

  6. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  7. runtime自动归档/解档

    原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...

  8. 数据持久化------Archiving(归档,解档)

    其中TRPerson为自定义的继承自NSObject的类的子类  其中有两个属性,name 和 age .h文件 #import @interface TRPerson : NSObject<& ...

  9. 使用偏好设置、属性列表、归档解档保存数据、恢复数据

    数据持久化就是将文件保存到硬盘,以便下次运行时可以读取或永久保存.iOS提供了以下几种持久化方案: NSUserDefaults (偏好设置) property list 即Plist (属性列表) ...

最新文章

  1. of python检索文献 science web_硕博士都在学的Python神技,有大神带!
  2. u大侠pe系统桌面计算机,详解各种PE启动的过程
  3. linux下使用rdesktop连接远程windows
  4. asp.net 应用数据缓存 -- Cache对象使用
  5. 人工智能与大数据的完美结合 1
  6. Bootstrap 3 加半星 Star rating with half-stars
  7. NOI.AC #31. MST
  8. lc滤波电路电感电容值选择_模拟电路中,电感的这些知识点你都清楚吗?
  9. 存数字,储未来——新华三2018存储瞄准闪存、海量、AI与超融合
  10. [转载]一个本科生在世界五大顶尖咨询公司实习心得
  11. typecho图标_使你的Typecho支持Emoji表情
  12. chrome书签搜索
  13. linux vi带 替换,vim替换命令_Linux vi/vim替换命令使用集锦
  14. Android和iPhone浏览器大战,第1部分,WebKit抢救
  15. matlab状态反馈控制器设计,H无穷的状态反馈控制器设计
  16. 达梦8初始化参数之BLANK_PAD_MODE
  17. JAVA EE面试重点
  18. 分布式架构项目的衡量指标及其目标
  19. 云开发mbti人格类型测试助手微信小程序源码
  20. 300万+企业财税服务平台微企宝,将于8月8日全球首发QB生态通证

热门文章

  1. DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
  2. pat 甲级 1034. Head of a Gang (30)
  3. 二维数组求和 团队开发
  4. shell脚本参数中有空格
  5. 计算机网络(十六)-轮询访问介质访问控制
  6. 解决问题 com.alibaba.fastjson.JSONObject cannot be cast to xxx
  7. 无返回值_只需一步,在Spring Boot中统一Restful API返回值格式与处理异常
  8. 3种团队分组适应项目_业务团队怎样做目标管理?更能激励员工?(附实操方法)...
  9. mysql 5.6的gtid_mode_[MySQL 5.6] GTID实现、运维变化及存在的bug
  10. 正则不能输入特殊字符_正则表达式语法学习和在线练习