1、为自定义数据类型添加 NSCoding 协议,实现该协议的接口
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
2、序列化对象的属性
id 类型的属性直接用 aCoder encodeObject: forKey: 序列化;
基础数值类型要用 NSNumber 封装后再进行序列化。
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.regionName forKey:@"regionName"];
NSNumber *lon = [NSNumber numberWithDouble:self.location.longitude];
NSNumber *lat = [NSNumber numberWithDouble:self.location.latitude];
[aCoder encodeObject:lon forKey:@"regionLon"];
[aCoder encodeObject:lat forKey:@"regionLat"];
}
3、反序列化对象的属性
使用 aDecoder decodeObjectForKey: 反序列化类型属性。
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self)
{
self.regionName = [aDecoder decodeObjectForKey:@"regionName"];
NSNumber *lon = [aDecoder decodeObjectForKey:@"regionLon"];
NSNumber *lat = [aDecoder decodeObjectForKey:@"regionLat"];
CLLocationCoordinate2D location;
location.longitude = [lon doubleValue];
location.latitude = [lat doubleValue];
self.location = location;
}
return self;
}
// 对象序列化成文件时保存的路径
#define FileSavePath ([NSHomeDirectory() stringByAppendingPathComponent:@"RegionList.plist"])
序列化对象到文件
[NSKeyedArchiver archiveRootObject:objectID toFile:path];
从文件中反序列化数据到对象
id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:path];