序列化: 將數據結構或對象轉換成二進制串的過程适袜。
反序列化:將在序列化過程中所生成的二進制串轉換成數據結構或者對象的過
面向對象的程序在運行的時候會創(chuàng)建一個復雜的對象圖添诉,經常要以二進制的方法序列化這個對象圖殖熟,這個過程叫做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"];