IOS 序列化与反序列化 NSKeyedUnarchiver

开篇网络

1到底这个序列化有啥做用?ide

面向对象的程序在运行的时候会建立一个复杂的对象图,常常要以二进制的方法序列化这个对象图,这个过程叫作Archiving. 二进制流能够经过网络或写入文件中(来源于某教材的一段话)加密

 本人的理解是当你于写数据须要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就比如加密和揭秘的过程。spa

2 为何我将数据写到plist 中的时候,也是存储到本地的磁盘上,可是我就没有序列化啊?代理

 你们有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型,,nsstring  ,你们有没有尝试过将一个本身定义的类放进去(写进plist ),在读出来?code

结果是什么你们能够先猜测。对象

其实在nsstring 的类的定义中已经添加了协议<nscoding> 即他是实现了nscoding 代理的方法的。继承

@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>string

深刻 it

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];

相关文章
相关标签/搜索