什么是序列化?序列化的作用是什么?iOS中怎么实现序列化?
目录
前言
什么是序列化?
序列化的作用?
iOS中怎么实现序列化?
举例
序列化需要注意的事项
前言
我们开发过程中或多或少都是会接触到序列化这个词,也有些人用过序列化的操作,但不知道这种操作叫做序列化。
什么是序列化?
序列化 (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);
代码运行结果:
序列化需要注意的事项
- 序列化只保存对象的状态,而不管对象的方法。
- 当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
- 当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。
什么是序列化?序列化的作用是什么?iOS中怎么实现序列化?相关推荐
- java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- Java序列化接口的作用总结1
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...
- java序列化和反序列化以及序列化ID的作用分析
java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...
- Java序列化接口的作用总结
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...
- Java序列化有什么作用
Java序列化有什么作用 一.作用 二.为什么没有被序列化的对象,也能进行传输 三.序列化的方式 1.Serializable 接口 2.Externalizable 接口 一.作用 对java对象进 ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- JAVA中对象的序列化的作用?
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...
- [Serializable]在C#中的作用-NET 中的对象序列化
简介 序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创 ...
- python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)...
6.3.7 序列化模块 (pickle,json,shelve,xml) 文件写入,数据传输时,我们都是以字符串形式写入的(因为字符串可以encode成bytes). 那其他类型(比如字典,列表等)想 ...
- java字段不序列化注解_@Transient注解的使用(不被序列化和作为临时变量存储)...
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...
最新文章
- 加速企业数字化转型,首届Spring Summit技术峰会圆满落幕
- 【深度学习笔记】关键点检测——标签(Ground Truth)构建
- 阿里巴巴代码规范-note
- c语言cobegin用法,用C语言实现P、V操作
- python量化数据处理小细节2
- java线程知识体系
- OpenShift 4 - DevSecOps Workshop (12) - 用CodeReady Workspace编辑提交应用代码
- vuex获取php数据,Nuxt中如何使用Vuex-Store异步获取数据
- 130. 被围绕的区域
- UVA 10330 Power Transmission
- 2018年第九届 蓝桥杯 java B组 部分题解
- MVC设计模式:概念,模型,视图,控制器
- The `certs(%1$s)` contains the merchant‘s certificate serial number(%2$s) which is not allowed here.
- Activity启动模式之SingleTask模式各种跳转
- 水晶易表 Xcelsius 2008 安装指南学习资源
- Best Android Remote Desktop Apps?
- 一周一英文测试文稿翻译 质量保障测试人员的一天
- Selenium中的EC模块
- 操作系统--进程调度实验报告
- Altium Designer-集成库制作
热门文章
- 10分钟搞定webpack打包
- [GRE] GRE协议介绍
- PyCharm 默认运行 unittest
- ObjectiveC: 变量和数据类型:初始化方法、外部/静态变量、枚举类型、typedef、类型转换、位运算符...
- 题目1012:畅通工程(并查集)
- bzoj2324: [ZJOI2011]营救皮卡丘
- Leetcode 27 Remove Element
- 25+开源的在线购物软件(PHP, JavaScript 和 ASP.Net)
- WPF之基于路径的动画
- 江湖二三事:听说你想做数据分析师?