開篇
1到底這個序列化有何作用恢恼?面向?qū)ο蟮某绦蛟谶\行的時候會創(chuàng)建一個復雜的對象圖瘸右,經(jīng)常要以二進制的方法序列化這個對象圖没龙,這個過程叫做Archiving. 二進制流可以通過網(wǎng)絡或?qū)懭胛募小?
當你寫的數(shù)據(jù)需要本地存儲時言津,即將你的數(shù)據(jù)寫到硬盤上的時候荣暮,你就必須對其進行序列化成畦,轉(zhuǎn)換成二進制文件距芬,從而便于在磁盤上的讀寫,同理在取出的時候必須將其在反序列化羡鸥,這樣才能將數(shù)據(jù)讀出來蔑穴,就好比加密和解密的過程。
2 為什么將數(shù)據(jù)寫到plist 中的時候惧浴,也是存儲到本地的磁盤上存和,但是沒有序列化??
大家有沒有發(fā)現(xiàn),其實plist 的數(shù)據(jù)是類型是有限制的捐腿,就那么幾種特定的數(shù)據(jù)類型nsstring? ,大家有沒有嘗試過將一個自己定義的類放進去(寫進plist )纵朋,再讀出來?
結(jié)果是什么大家可以先猜想茄袖。
其實在nsstring 的類的定義中已經(jīng)添加了協(xié)議即實現(xiàn)了nscoding 代理的方法操软。
@interface? NSString : NSObject
深入3
?NScoder? 和 NScoding NScoding 是一個協(xié)議,
主要有下面兩個方法-(id)initWithCoder:(NSCoder *)coder;//從coder中讀取數(shù)據(jù)宪祥,保存到相應的變量中聂薪,即反序列化數(shù)據(jù)
-(void)encodeWithCoder:(NSCoder *)coder;// 讀取實例變量,并把這些數(shù)據(jù)寫到coder中去蝗羊。
序列化數(shù)據(jù)NSCoder 是一個抽象類藏澳,抽象類不能被實例話,只能提供一些想讓子類繼承的方法耀找。
NSKeyedUnarchiver? 從二進制流讀取對象翔悠。
NSKeyedArchiver? ? ? 把對象寫到二進制流中去。
4一個簡單的例子一般是在自己定義的類中需要在.h 文件中加入在.m 文件眾實現(xiàn)他的的兩個代理方法野芒,這個代理方法將會被自動調(diào)用
- (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];