现在的位置: 首页 > 综合 > 正文

objective-c自定义类对象的序列化和反序列化

2013年04月01日 ⁄ 综合 ⁄ 共 1393字 ⁄ 字号 评论关闭

在ios应用中如果需要保存大对象数据可以采用xml文件或者属性文件方式,但由于采用的纯文本方式保密性不够,如将保存数据封装为自定义类的实例通过序列化的二进制方式进行保存,这样安全性会有所提高。另外后面文章将介绍一些RSA、MD5等算法对保存数据进行加密和解密。

具有序列化能力的类必须实现NSCoding协议的两个函数:

-(void) encodeWithCoder:(NSCoder *)encoder;
-(id) initWithCoder:(NSCoder *)decoder;

其中encodeWithCoder函数使自定义对象的各数据字段序列化,initWithCoder函数使二进制数据文件反序列化为对象实例。

例如一个网站的注册用户信息类,包含站点名称siteName、站点地址siteAddress、注册用户名userName、登录密码password、用户头像logoImage。

该数据类的声明代码:

#import <Foundation/Foundation.h>

@interface RegUserInfo : NSObject <NSCoding> {
    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"];
}

注意:为序列化指定的key值必须保持唯一性,编码和解码过程中使用的key必须一致。

对userInfo对象的序列化和反序列化代码如下所示。

/*序列化成arch.dat文件*/
[NSKeyedArchiver archiveRootObject:userInfo toFile:@"arch.dat"];

/*由文件arch.dat反序列化成RegUserInfo对象*/
RegUserInfo *newUserInfo = [NSKeyedUnarchiver unarchiveObjectWithFile: @"arch.dat"];

转帖:http://blog.csdn.net/hsyj_0001/article/details/7594642

抱歉!评论已关闭.