1到底这个序列化有啥作用?

面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一段话)

本人的理解是当你于写数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就好比加密和揭秘的过程。

2 为什么我将数据写到plist 中的时候,也是存储到本地的磁盘上,但是我就没有序列化啊?

大家有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型,,nsstring  ,大家有没有尝试过将一个自己定义的类放进去(写进plist ),在读出来?

结果是什么大家可以先猜想。

其实在nsstring 的类的定义中已经添加了协议<nscoding> 即他是实现了nscoding 代理的方法的。

@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>

深入

3 NScoder  和 NScoding

NScoding 是一个协议,主要有下面两个方法

-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据

-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据

NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。

NSKeyedUnarchiver   从二进制流读取对象。

NSKeyedArchiver       把对象写到二进制流中去。

4一个简单的例子

一般是在自己定义的类中需要在.h 文件中加入<NScoding>

在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用

- (void)encodeWithCoder:(NSCoder *)aCoder 
{
    [aCoder encodeObject:self.InsureSolutionID forKey:@"personName"];
    [aCoder encodeObject:self.InsureSolutionName forKey:@"personAge"];
}

- (id)initWithCoder:(NSCoder *)aDecoder 
{
    self = [super init];
    if (self) 
    {
        self.InsureSolutionID = [aDecoder decodeObjectForKey:@"personName"];
        self.InsureSolutionName = [aDecoder decodeObjectForKey:@"personAge"];
    }
    return self;
}

以上是对该类序列化和反序列化。

NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:self.DataArray];
    [[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"DataArray"];

NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"DataArray"];
     self.dataList = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];

ios 序列化的更多相关文章

  1. 【原】iOS动态性(四):一行代码实现iOS序列化与反序列化(runtime)

    为取得更好的排版效果,本文同样发布在简书上,强烈建议跳转到[1]http://www.jianshu.com/p/fed1dcb1ac9f 一.变量声明 为便于下文讨论,提前创建父类Biology以及 ...

  2. 一行代码实现iOS序列化与反序列化(runtime)

    一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...

  3. 一行代码实现iOS序列化与反序列化

    一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...

  4. 实现iOS序列化与反序列化(runtime)

    一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...

  5. IOS 序列化与反序列化NSKeyedUnarchiver

    开篇 1到底这个序列化有何作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中. 当你写的 ...

  6. iOS 序列化与反序列化

    开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教 ...

  7. iOS序列化与反序列化

    1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...

  8. iOS 序列化和反序列化

    摘自:http://hi.baidu.com/popln/blog/item/c3dd9302bb37e994d43f7ccb.html 开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会 ...

  9. Runtime(IV) - 序列化与反序列化

    准备条件 父类 Biology Biology.h #import <Foundation/Foundation.h> @interface Biology : NSObject { NS ...

随机推荐

  1. 一文解析总结Java虚拟机内存区域模型

    最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...

  2. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  3. C# 可空类型(Nullable)

    C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable< Int32 >,读作& ...

  4. Tinghua Data Mining 6

    Networks 多层感知机 不是说这个神经网络要与人的大脑神经完全相似,也不是说要多么的强大,而是在一定程度上模拟了人脑神经元的能力,就足够了 为什么要w0呢,因为没有w0超平面一定会经过原点,所以 ...

  5. HDU6440(费马小定理)

    其实我读题都懵逼--他给出一个素数p,让你设计一种加和乘的运算使得\[(m+n)^p = m^p+n^p\] 答案是设计成%p意义下的加法和乘法,这样:\[(m+n)^p\ \%\ p = m+n\] ...

  6. Linux 批量杀进程的命令

    使用awk批量杀进程的命令: ps -ef | grep firefox | grep -v grep | awk '{print "kill -9 "$2}'|sh #列出了当前 ...

  7. python_22(Form-CRM)

    第1章 CRM 1.1 建项目 1.2 settings1.3 规范url 1.4 公共的后台模板1.5 创建部门表 1.6 建库移库 1.7 母版继承 1.7.1 导入static 1.7.2 导入 ...

  8. centos7 更换jdk版本

    查看java版本   java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...

  9. PM2常用命令

    安装pm2 npm install -g pm2 1.启动 pm2 start app.js pm2 start app.js --name my-api    #my-api为PM2进程名称 pm2 ...

  10. 定时任务-Timer

    Timer类的全限定名 java.util.Timer java.util.Timer类的构造函数 public Timer(); public Timer(boolean isDaemon); pu ...