天天看點

iOS 序列化和反序列化

開篇

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