NSKeyedArchiver/unArchiver序列化自定义复合模型(模型包含模型)

来源:互联网 发布:提高智商知乎 编辑:程序博客网 时间:2024/05/22 09:52

在这里利用NSKeyedArchiver/unArchiver对自定义的模型进行序列化。在序列化之前要对自定义模式实现NSCoding的2个协议。

NScoding 是一个协议,主要有下面两个方法
-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据

NSKeyedUnarchiver   从二进制流读取对象。
NSKeyedArchiver       把对象写到二进制流中去。

Info模型:

Info.h

#import <Foundation/Foundation.h>@interface Info : NSObject<NSCoding>@property(nonatomic, copy)NSString *infoName;@property(nonatomic, assign)NSInteger infoCount;@end


Info.m
#import "Info.h"@implementation Info-(id)initWithCoder:(NSCoder *)aDecoder{    if (self = [super init]) {                self.infoName = [aDecoder decodeObjectForKey:@"infoName"];        self.infoCount = [aDecoder decodeIntegerForKey:@"infoCount"];            }        return self;}- (void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:self.infoName forKey:@"infoName"];    [aCoder encodeInteger:self.infoCount forKey:@"infoCount"];}



User模型:

User.h   //User模型包含Info模型;

#import <Foundation/Foundation.h>#import "Info.h"@interface User : NSObject<NSCoding>@property(nonatomic, copy)NSString *name;@property(nonatomic, assign)NSInteger age;@property(nonatomic, strong)NSArray *friends;@property(nonatomic, strong)Info *infomation;@end

User.m

#import "User.h"@implementation User- (id)init{    if (self = [super init]) {                self.infomation = [[Info alloc] init];    }    return self;}-(id)initWithCoder:(NSCoder *)aDecoder{        if (self = [super init]) {                self.name = [aDecoder decodeObjectForKey:@"name"];        self.friends = [aDecoder decodeObjectForKey:@"friends"];        self.infomation =[aDecoder decodeObjectForKey:@"infomation"];        self.age = [aDecoder decodeIntegerForKey:@"age"];            }        return self;}- (void)encodeWithCoder:(NSCoder *)aCoder{        [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeObject:self.friends forKey:@"friends"];    [aCoder encodeObject:self.infomation forKey:@"infomation"];    [aCoder encodeInteger:self.age forKey:@"age"];}@end


序列化测试代码:

#pragma mark - 序列化测试;- (void)serialTest{    User *user = [[User alloc] init];    user.name = @"zhenjie";    user.age = 22;    user.friends = @[@"qiang",@"ze"];//    user.infomation = [[Info alloc] init];    user.infomation.infoName = @"my info name";    user.infomation.infoCount = 1;        User *user1 = [[User alloc] init];    user1.name = @"zhenjie1";    user1.age = 22;    user1.friends = @[@"qiang1",@"ze1"];    //    user.infomation = [[Info alloc] init];    user1.infomation.infoName = @"my info name1";    user1.infomation.infoCount = 2;            //模型序列化    NSData *data_en = [NSKeyedArchiver archivedDataWithRootObject:user];    [[NSUserDefaults standardUserDefaults] setObject:data_en forKey:@"data"];        NSData *data_de =[[NSUserDefaults standardUserDefaults] objectForKey:@"data"];    User *user_de = [NSKeyedUnarchiver unarchiveObjectWithData:data_de];    /*    //模型对象数组序列化    NSArray *arr_en = @[user, user1];    NSData *data_en = [NSKeyedArchiver archivedDataWithRootObject:arr_en];    [[NSUserDefaults standardUserDefaults] setObject:data_en forKey:@"data"];        NSLog(@"----------------\n");    NSData *data_de =[[NSUserDefaults standardUserDefaults] objectForKey:@"data"];    NSArray *arr_de = [NSKeyedUnarchiver unarchiveObjectWithData:data_de];    NSLog(@"===user_de:%@",arr_en);     */}


0 0
原创粉丝点击