开篇
1到底这个序列化有啥作用?
面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一段话)
本人的理解是当你于写数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就好比加密和揭秘的过程。
2 为什么我将数据写到plist 中的时候,也是存储到本地的磁盘上,但是我就没有序列化啊?
大家有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型,,nsstring ,大家有没有尝试过将一个自己定义的类放进去(写进plist ),在读出来?
结果是什么大家可以先猜想。
其实在nsstring 的类的定义中已经添加了协议<nscoding> 即他是实现了nscoding 代理的方法的。
@interface nsstring : nsobject <nscopying, nsmutablecopying, nscoding>
深入
3 nscoder 和 nscoding
nscoding 是一个协议,主要有下面两个方法
-(id)initwithcoder:(nscoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(void)encodewithcoder:(nscoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据
nscoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。
nskeyedunarchiver 从二进制流读取对象。
nskeyedarchiver 把对象写到二进制流中去。
4一个简单的例子
一般是在自己定义的类中需要在.h 文件中加入<nscoding>
在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用
- (void)encodewithcoder:(nscoder *)acoder
{
[acoder encodeobject:self.insuresolutionid forkey:@"personname"];
[acoder encodeobject:self.insuresolutionname forkey:@"personage"];
}
- (id)initwithcoder:(nscoder *)adecoder
self = [super init];
if (self)
{
self.insuresolutionid = [adecoder decodeobjectforkey:@"personname"];
self.insuresolutionname = [adecoder decodeobjectforkey:@"personage"];
}
return self;
以上是对该类序列化和反序列化。
nsdata *archivecarpricedata = [nskeyedarchiver archiveddatawithrootobject:self.dataarray];
[[nsuserdefaults standarduserdefaults] setobject:archivecarpricedata forkey:@"dataarray"];
nsdata *myencodedobject = [[nsuserdefaults standarduserdefaults] objectforkey:@"dataarray"];
self.datalist = [nskeyedunarchiver unarchiveobjectwithdata: myencodedobject];