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