什么是序列化?序列化的作用是什么?iOS中怎么实现序列化?

目录

 

前言

什么是序列化?

序列化的作用?

iOS中怎么实现序列化?

举例

序列化需要注意的事项


前言

我们开发过程中或多或少都是会接触到序列化这个词,也有些人用过序列化的操作,但不知道这种操作叫做序列化。

什么是序列化?

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

序列化的作用?

  1. 以某种存储形式使自定义对象持久化
  2. 将对象从一个地方传递到另一个地方。
  3. 使程序更具维护性。

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);

 

代码运行结果:

解档

 

 

序列化需要注意的事项

  1.   序列化只保存对象的状态,而不管对象的方法。
  2.   当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
  3.   当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡卡西Sensei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值