复杂对象的存储--model类型对象归档(序列化),NSCoding

NSData是一个字节缓冲区的面向对象封装。这意味着,将数据转换成NSData对象可以实现数据存储和读取.而NSCoding恰好可以做到这一点。

NSCoding协议规定了两个必须实现的方法:initWithCoder:和encodeWithCoder:。initWithCoder:方法使用给定的状态初始化一个新对象,也称为反序列化。encodeWithCoder:方法接收一个带状态的对象,并对其进行序列化。我们这么理解,把encodeWithCoder:方法理解成将对象打包准备传输,把initWithCoder:方法理解成将接收到的数据解包成可用的对象。

我们接下来通过一个简单的model类实现归档与归档

#Model.h

#warning 第一步:NSCoding协议

@interface Model : NSObject<</span>NSCoding>

@property (nonatomic, retain)NSString *name;

@property (nonatomic, assign)NSInteger age;

     #Model.m

#warning 第二步:将属性按照一定顺序进行归纳

//归档(序列化)的协议,将属性转换为NSData的时候

- (void)encodeWithCoder:(NSCoder *)aCoder

{

  [aCoder encodeObject:self.name forKey:@"name"];

    [aCoder encodeInteger:self.age forKey:@"age"];

    


}

//反归档(反序列化),NSData转换为Model的时候,将对应的属性进行赋值

- (id)initWithCoder:(NSCoder *)aDecoder

{

    self = [super init];

    if (self) {

        self.name = [aDecoder decodeObjectForKey:@"name"];

        self.age = [aDecoder decodeIntegerForKey:@"age"];  

    }

    return self;

}

- (void)viewDidLoad {

    [super viewDidLoad];

//model类型的对象归档为(序列化)NSData类型的对象.然后将NSData类型对象进行存储

    Model *model = [[Model alloc] init];

    model.name = @"蒙牛酸酸乳";

    model.age = 20;

//model装换为data

//如果model在数组中,想要存储数组,也必须用复杂类型对象将数组转为data,然后进行存储(一种加密模式)

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];

    NSString *pathStr = [NSString stringWithFormat:@"%@/model.txt", path];

    [data writeToFile:pathStr atomically:YES]; //将文件写入本地

    [self readModel];

//  NSLog(@"path = %@", pathStr);


}


文件读取

- (void)readModel

{

    NSString *str = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];

    NSString *path = [NSString stringWithFormat:@"%@/model.txt", str];

    NSData *data = [NSData dataWithContentsOfFile:path];

//data装换为model   如果在归档的时候是数组,那么反归档的倒得的也是数组

    Model *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];

    NSLog(@"name :%@ age: %ld", model.name, model.age);

    

    

 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值