目录
前言
我们开发过程中或多或少都是会接触到序列化这个词,也有些人用过序列化的操作,但不知道这种操作叫做序列化。
什么是序列化?
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。
序列化的作用?
- 以某种存储形式使自定义对象持久化;
- 将对象从一个地方传递到另一个地方。
- 使程序更具维护性。
iOS中怎么实现序列化?
在iOS实际开发中,我们也会使用到序列化,很多人会说,没有啊?我们iOS中有序列化这个词吗?
那我再说一个词,“归档”,归档用过吧?归档就是我们在iOS开发中使用序列化的场景!
在iOS中一个自定义对象是无法直接存入到文件中的,必须先转化成二进制流才行。从对象到二进制数据的过程我们一般称为对象的序列化(Serialization),也称为归档(Archive)。同理,从二进制数据到对象的过程一般称为反序列化或者反归档(解档)。
在序列化需要实现NSCoding以及NSCopying(非必须)协议
举例
- 创建一个Person类
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *sex;
@end
Person.m
#import "Person.h"
@implementation Person
#if 0
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//解档
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder {
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- 控制器中操作
序列化(归档)
Person *person = [[Person alloc] init];
person.name = @"Frank";
person.age = 18;
//这里以temp路径为例,存到temp路径下
NSString *temp = NSTemporaryDirectory();
NSString *filePath = [temp stringByAppendingPathComponent:@"obj.data"]; //注:保存文件的扩展名可以任意取,不影响。
NSLog(@"%@", filePath);
//归档
BOOL isSuccess = [NSKeyedArchiver archiveRootObject:person toFile:filePath];
if(isSuccess) {
NSLog(@"归档成功");
}else{
NSLog(@"归档失败");
}
代码运行结果:
根据打印的路径找到归档的文件
反序列化(解档)
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"obj.data"];
// 解档
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name:%@,age:%ld",person.name,person.age);
代码运行结果:
序列化需要注意的事项
- 序列化只保存对象的状态,而不管对象的方法。
- 当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
- 当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。