iOS:序列化與反序列化

序列化: 將數據結構或對象轉換成二進制串的過程。

反序列化:將在序列化過程中所生成的二進制串轉換成數據結構或者對象的過

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

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

在ios應用中如果需要保存大對象數據可以采用xml文件或者屬性文件方式,但由于采用的純文本方式保密性不夠,如將保存數據封裝為自定義類的實例通過序列化的二進制方式進行保存,這樣安全性會有所提高。

具有序列化能力的類必須實現NSCoding協議的兩個函數:

-(void) encodeWithCoder:(NSCoder *)encoder;

-(id) initWithCoder:(NSCoder *)decoder;

其中encodeWithCoder函數使自定義對象的各數據字段序列化,initWithCoder函數使二進制數據文件反序列化為對象實例。例如一個網站的注冊用戶信息類,包含站點名稱siteName、站點地址siteAddress、注冊用戶名userName、登錄密碼password、用戶頭像logoImage。該數據類的聲明代碼:#import@interface RegUserInfo : NSObject{

NSString *siteName;

NSString *siteAddress;

NSString *userName;

UIImage *logoImage;

}

@property (nonatomic, strong) NSString *siteName, *siteAddress, *userName;

@property (nonatomic, strong) UIImage *logoImage;

@end

對數據成員序列化時需要實現- (void)encodeObject:(id)objv forKey:(NSString*)key,如果數據成員是基本數據類型int時,需要使用

- (void)encodeInt:(int)intv forKey:(NSString*)key,encodeWithCoder的具體實現方式如下所示。

-(void) encodeWithCoder:(NSCoder *)encoder {

[encoder encodeObject:siteName forKey:@"siteName"];

[encoder encodeObject:siteAddress forKey:@"siteAddress"];

[encoder encodeObject:userName forKey:@"userName"];

[encoder encodeObject:logoImage forKey:@"logoImage"];

}

同樣反序列化時需要實現-(id) initWithCoder:(NSCoder *)decoder方法,針對每個數據成員使用- (id)decodeObjectForKey:(NSString *)key方法進行解碼。具體代碼如下所示。

-(id) initWithCoder:(NSCoder *)decoder {

siteName = [decoder decodeObjectForKey:@"siteName"];

siteAddress = [decoder decodeObjectForKey:@"siteAddress"];

logoImage = [decoder decodeObjectForKey:@"userName"];

siteLogo = [decoder decodeObjectForKey:@"logoImage"];

return self;

}

注意:為序列化指定的key值必須保持唯一性,編碼和解碼過程中使用的key必須一致。

對userInfo對象的序列化和反序列化代碼如下所示。

/*序列化成arch.dat文件*/

[NSKeyedArchiver archiveRootObject:userInfo toFile:@"arch.dat"];

/*由文件arch.dat反序列化成RegUserInfo對象*/

RegUserInfo *newUserInfo = [NSKeyedUnarchiver unarchiveObjectWithFile: @"arch.dat"];

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

推薦閱讀更多精彩內容