归档和解档-Archiver

一、概念

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。采用二进制的格式比采用文本的格式占用的空间小,读写速度高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

碧雪情天服务器地址源如何修改,稀有游戏《碧雪情天online》网络版王者归来一键服务端+客户端 支持转生系统和新图...

碧雪情天online王者归来版本介绍:1.增加新的职业套装;2.增加高川台、雪域、魔灵和天庭等新图;3.仙侠岭先知处添加角色转生功能;4.碣石村宝官添加装备签名和祝福卡兑换角色经验功能;5.增加宠物经验兑换角色经验功能;6.其它新内容和…

Objective-C单例

一、要点:1.当在应用程序中只需要有类的一个实例,并且可以被其它对象轻松的访问的时候,可以使用单例类。2.首先需要声明一个静态的类的实例变量,并初始化为nil。应该将该实例变量声明在类的实现文件中,表示变量仅在该实…

刚买的ubuntu服务器 为什么没有文件,新买的linux服务器怎么使用

新买的linux服务器怎么使用 内容精选换一换切换操作系统是为您的弹性云服务器重新切换一个系统盘。切换完成后弹性云服务器的系统盘ID会发生改变,并删除原有系统盘。如果弹性云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高),…

iOS应用横竖屏切换

一、概述: 在iOS应用中,由UIViewController来控制屏幕翻转,根据需要随设备方向自动切换。在iOS6和之前的系统之间,控制方法发生了些变化。二、视图伸缩属性:1.UIView类的autoresizingMask属性,用来指定当它…

iOS简单动画实现方案

一、仿射变换--CGAffineTransform1.仿射变换,一种基于二维坐标的转换功能。CGAffineTransform数据结构代表一个二维坐标系的转换矩阵。2.通过CGAffineTransform数据结构,可以构造二维坐标系内的平移、伸缩、旋转矩阵。详情可以参看苹果开发文档中关于该数…

三维转换矩阵解释

一、图解 二、单位矩阵{1.0f,0.0f,0.0f,0.0f;0.0f,1.0f,0.0f,0.0f;0.0f,0.0f,1.0f,0.0f;0.0f,0.0f,0.0f,1.0f;}

Objective-C文件流操作

一、NSFileHandle1.它能够以流的方式访问基于文件、网络、管道、设备的数据,可以设置写入的位置指针。2.NSData、NSString写入文件的方法是直接覆盖写入,全部读出,当处理大数据的文件时,对内存会造成压力。而NSFileHandle能够以流…

CoreAnimation编程指南(简介)

一、核心动画编程介绍1.本文档介绍了在使用核心动画时所涉及的基本概念。核心动画的是Objective – C的框架,它通过简单的动画编程接口来提供一套高性能的动画引擎。2.你应该阅读此文档来理解Cocoa应用程序核心动画工作的机制。 阅读此文档的前提是你已经掌握了Obje…

CoreAnimation编程指南(一)概念

一、概述1.核心动画是一套包含图形绘制,投影,动画的Objective–C类集合。它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流畅的动画。2.动态的动画接口很难创建,但是核…

python实现常见排序算法

python实现常见排序算法 快速排序 思想&#xff1a;取出第一个元素把它放到序列的中间某一个正确位置&#xff0c;以它进行分割成左边和右边&#xff0c;再分别对左边和右边进行取元素分割&#xff08;递归&#xff09; 递归实现 def quicksort(array):if len(array) < …

CoreAnimation编程指南(二)渲染架构

1.虽然核心动画的图层和Cocoa的视图在很大程度上没有一定的相似性&#xff0c;但是他们两者最大的区别是&#xff0c;图层不会直接渲染到屏幕上。2.在模型-视图-控制器&#xff08;model-view-controller&#xff09;概念里面NSView和UIView是典型的视图部分&#xff0c;但是在…

学习递归

算法之递归 递归思想 递归就是函数自己调用自己&#xff0c;会使代码逻辑很清晰&#xff0c;但是Stack Overflow上有说的一句话&#xff1a;“如果使用循环&#xff0c;程序的性能可能更高&#xff1b;如果使用递归&#xff0c;程序可能更容易理解。如何选择要看什么对你来说…

CoreAnimation编程指南(三)几何变换

本章介绍图层的几何组成部分&#xff0c;及他们之间的相互关&#xff0c;同时介绍如何变换矩阵可以产生复杂的视觉效果。一、图层的坐标系1.图层的坐标系在不同平台上面具有差异性。在iOS系统中&#xff0c;默认的坐标系统原点在图层的中心左上角地方&#xff0c;原点向右和向下…

队列和栈

栈 一张图可以简单的说明 为了达到时间复杂度最低&#xff1a;选择的是python列表实现栈&#xff0c;而列表是顺序表 入栈push的时候选择在列表的尾部进行添加元素&#xff0c;出栈在列表尾部弹出 class Stack(object):"""栈"""def __init__(…

CoreAnimation编程指南(四)图层树结构

图层不但给自己提供可视化的内容和管理动画&#xff0c;而且充当了其他图层的容器类&#xff0c;构建图层层次结构。 本章介绍了图层层次结构&#xff0c;以及如何操纵该图层层次结构。一、什么是图层树的层次结构1.图层树是核心动画里面类似Cocoa视图的层次结构。比如一个NSVi…

学习散列表

回顾一下简单查找和二分查找 杂货店商品对应的价格举例&#xff1a; 简单查找就是拿出商品价目本&#xff0c;这个价目本并不是有序的&#xff0c;顾客问苹果多少钱&#xff0c;需要一个一个去查找某一个商品的价格&#xff0c;需要O(n)时间。 同样是一个价目本&#xff0c;但…

CoreAnimation编程指南(五)图层内容

当我们使用Cocoa的视图的时候&#xff0c;我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容。但是CALayer实例可以直接使用&#xff0c;而无需继承子类。因为CALayer是一个键-值编码兼容的容器类&#xff0c;你可以在实例里面存储任意值&#xff0c;所以子类实…

SHA算法

回顾散列算法 我的上篇文章&#xff1a;学习散列表 在上篇文章杂货铺的示例中&#xff0c;我们希望散列函数的结果是均匀分布的。散列函数接受一个字符串&#xff0c;并返回一 个索引号。 安全散列算法&#xff08;secure hash algorithm&#xff0c; SHA&#xff09;函数 给…

CoreAnimation编程指南(六)动画

动画是当今用户界面的关键因素。当使用核心动画的时候&#xff0c;动画是自动完成的。没有动画的循环和计数器。你的应用程序不负负责重绘&#xff0c;也不负责跟踪动画的当前状态。动画在独立线程里面自动执行&#xff0c;没有和你的应用程序交互。本章提供了对动画类的概览&a…

CoreAnimation编程指南(七)图层Action

图层的行为在以下情况发生的时候被触发&#xff1a;从图层树里面插入或者删除一个图层&#xff0c;图层的属性值被修改了&#xff0c;或者程序显式要求。通常情况下&#xff0c;行为触发器是动画显示的结果所在。1.1 行为对象的角色一个行为对象是一个通过CAAction协议响应行为…