序列化: 将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过
面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做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"];
网友评论