iOS 序列化和反序列化

//聯系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄

前言

1到底這個序列化有啥作用?

面向對象的程序在運行的時候會創建一個復雜的對象圖,經常要以二進制的方法序列化這個對象圖,這個過程叫做Archiving. 二進制流可以通過網絡或寫入文件中(來源于某教材的一段話)

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

2 為什么我將數據寫到plist 中的時候,也是存儲到本地的磁盤上,但是我就沒有序列化啊?

大家有沒有發現,其實plist 的數據是類型是有限制的,就那么幾種特定的數據類型,,nsstring? ,大家有沒有嘗試過將一個自己定義的類放進去(寫進plist ),在讀出來?

結果是什么大家可以先猜想。

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

@interface NSString : NSObject

深入

3 NScoder? 和 NScoding

NScoding 是一個協議,主要有下面兩個方法

-(id)initWithCoder:(NSCoder *)coder;//從coder中讀取數據,保存到相應的變量中,即反序列化數據

-(void)encodeWithCoder:(NSCoder *)coder;// 讀取實例變量,并把這些數據寫到coder中去。序列化數據

NSCoder是一個抽象類,抽象類不能被實例話,只能提供一些想讓子類繼承的方法。

NSKeyedUnarchiver從二進制流讀取對象。

NSKeyedArchiver把對象寫到二進制流中去。

4一個簡單的例子

一般是在自己定義的類中需要在.h 文件中加入

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

謝謝!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容