1.前言:
一般都是简单的数据类型(int,nsstring等)存储到plist 但是对于复杂的对象存储到plist或者NSUserDefault的时候就需要将对象序列化 ==编码/解码(序列化成二进制data来储存)
2. 用例场景
消息推送过来(消息对象) 用户这时候刚好把程序kill了 此时需要把这个对象保存起来(NSUserDefault)就需要把对象序列化后存储
//
// Car.h
// demo
//
// Created by linpeng on 14-7-30.
// Copyright (c) 2014年 linpeng. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "LKDBHelper.h"
@interface Country : NSObject
/**
* 名字
*/
@property(nonatomic,strong)NSString *name;
@end
//===============================
@interface Car : NSObject<NSCoding,NSCopying,NSMutableCopying>
/**
* 颜色
*/
@property(nonatomic,strong)NSString *color;
/**
* 中国制造
*/
@property(nonatomic,strong)NSString *madeBy;
/**
* 进口国
*/
@property(nonatomic,strong)Country *comeFrom;
@end
//
// Car.m
// demo
//
// Created by linpeng on 14-7-30.
// Copyright (c) 2014年 linpeng. All rights reserved.
//
#import "Car.h"
@implementation Country
//将对象解码(反序列化)
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
//将对象编码(即:序列化)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
}
@end
@implementation Car
+(NSString *)getTableName
{
return @"CarTable";
}
//将对象解码(反序列化)
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init]) {
self.color = [aDecoder decodeObjectForKey:@"color"];
self.madeBy = [aDecoder decodeObjectForKey:@"madeBy"];
self.comeFrom = [aDecoder decodeObjectForKey:@"comeFrom"];
}
return self;
}
//将对象编码(即:序列化)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.color forKey:@"color"];
[aCoder encodeObject:self.madeBy forKey:@"madeBy"];
[aCoder encodeObject:self.comeFrom forKey:@"comeFrom"];
}
@end
3.使用
NSKeyedArchiver //编码 / 序列化
NSKeyedUnarchiver //解码 /反序列化
Car *car = [[Car alloc] init];
car.color = @"reddadas";
car.madeBy = @"linpeng";
Country *c = [[Country alloc] init];
c.name = @"中国";
car.comeFrom = c;
//序列化
NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:car];
//存储
[[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"car"];
NSLog(@"%@",archiveCarPriceData);
//读取
NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"car"];
//反序列化
Car *cars = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
NSLog(@"====%@=====%@===%@=\n",cars.color,cars.madeBy,cars.comeFrom.name);
4.结果