IOS 序列化與反序列化NSKeyedUnarchiver

開篇網絡

1到底這個序列化有何做用?加密

面向對象的程序在運行的時候會建立一個複雜的對象圖,常常要以二進制的方法序列化這個對象圖,這個過程叫作Archiving. 二進制流能夠經過網絡或寫入文件中。spa

 當你寫的數據須要本地存儲時,即將你的數據寫到硬盤上的時候,你就必須對其進行序列化,轉換成二進制文件,從而便於在磁盤上的讀寫,同理在取出的時候必須將其在反序列化,這樣才能將數據讀出來,就比如加密和解密的過程。.net

2 爲何將數據寫到plist 中的時候,也是存儲到本地的磁盤上,可是沒有序列化?代理

 你們有沒有發現,其實plist 的數據是類型是有限制的,就那麼幾種特定的數據類型nsstring  ,你們有沒有嘗試過將一個本身定義的類放進去(寫進plist ),再讀出來?code

結果是什麼你們能夠先猜測。對象

其實在nsstring 的類的定義中已經添加了協議<nscoding> 即實現了nscoding 代理的方法。繼承

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

深刻string

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

相關文章
相關標籤/搜索