您的位置:首页 > 移动开发 > Objective-C

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

2013-03-08 16:03 363 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: