NSKeyedArchiver
和NSKeyedUnarchiver
两个类把对象序列化和反序列化。
所有的序列化对象必须继承NSSecureCoding
,例如NSString
、NSArray
等
- (void)stringArchiver {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"Hello World" requiringSecureCoding:YES error:nil];
[data writeToFile:self.dataPath options:0 error:nil];
}
- (void)stringUnarchiver {
NSData *data = [NSData dataWithContentsOfFile:self.dataPath options:0 error:nil];
NSString *str = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] fromData:data error:nil];
NSLog(@"%@", str);
}
自定义序列化对象Person
同样需要继承NSSecureCoding
,并实现initWithCoder:
、encodeWithCoder:
和supportsSecureCoding
方法
// Person.h
@interface Person : NSObject <NSSecureCoding>
@property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) NSInteger age;
@end
// Person.m
@implementation Person
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aEncoder {
[aEncoder encodeObject:self.name forKey:@"name"];
[aEncoder encodeInteger:self.age forKey:@"age"];
}
+ (BOOL)supportsSecureCoding {
return YES;
}
- (NSString *)description {
return [NSString stringWithFormat:@"%@ - %ld", self.name, self.age];
}
@end
序列化和反序列化
- (void)objectArchiver {
Person *person = [[Person alloc] init];
person.name = @"Jack";
person.age = 18;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:nil];
[data writeToFile:self.dataPath options:0 error:nil];
}
- (void)objectUnarchiver {
NSData *data = [NSData dataWithContentsOfFile:self.dataPath options:0 error:nil];
Person *person = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil];
NSLog(@"%@", person);
}