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