什么是序列化?序列化的作用是什么?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.   当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。

猜你喜欢

转载自blog.csdn.net/zjpjay/article/details/86518545