时尚正反序列

IOS 序列化与反序列化

摘自:http://hi.baidu.com/popln/blog/item/c3dd9302bb37e994d43f7ccb.html

开篇

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

时间: 2024-10-23 17:37:12

时尚正反序列的相关文章

HashSet的故事----Jdk源码解读

Hash,我们在说HashMap的时候,已经知道Hash是散列,Map是映射了. 那么Set又是什么呢 ? 先来看看Set的翻译是什么 n. [数] 集合:一套:布景:[机] 装置 这里Set所取的含义是集合.而且是数学概念上的集合.数学概念上的集合有什么特点呢?那就是Set中所有的元素不能重复.所以HashSet的意思就是以散列的形式维持一套不会有重复元素的集合. 接下来我们看看HashSet是怎么被Jdk实现的吧.(其实逻辑非常简单.) 类的声明: hashSet 继承自AbstractSe

swust oj 763--校门外的树 Plus(暴力枚举)

题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有N排树,每一排树的长度可能不同.每一棵树都用字符作了一个标记. 现在由于学校修建教师公寓,需要在每排树中砍一段连续的树.要求是在每一排树中砍掉的那一段树标记序列都相同. 例如第1排:ABCD,第2排BCDFF,第3排:BRCD,那么我们就可以在每一排树中砍掉CD.请注意下面测试数据的第二组,我们可以

iOS随笔-Xcode使用-文档翻译

本文是个人翻译记录~并不是技术分享~有想看中文文档的,可以阅览一下~ About Debugging with Xcode 关于Xcode调节器 寻找和消除代码中的问题是开发过程中的一个关键部分.Xcode调试器预置的通用调试有用的功能,你的应用程序启动时自动运行.调试器可以帮助您: 1.确定和定位问题2.检查运行代码的控制流和数据结构,以查找原因3.制定一个解决方案,并编辑相应的代码4.运行修改后的应用程序,并确认该修补程序 你应该熟悉应用程序设计和编程的概念.与一些熟悉Xcode也推荐:看到

DNS正反解析、主从复制、子域授权、安全相关配置

原理: 我们都知道,在"记忆"的角色上,人脑总是不如计算机,而人们对文字的印象又比数字高.因此,想要使用纯粹的TCP/IP来上网,实在不好记忆又很麻烦,为了适应人类的使用习惯,一个名为DNS的服务帮我们将主机名解析为IP好让大家只要记得主机名就能使用Internet,由于目前的IPv4已经接近分配完毕的阶段,因此128bits的IPv6会逐渐热门起来,如果背128位的IP上网想必是不可能的,可以想象它会越来越重要. 域名和服务概述 FQDN:Fully Qualified Domaim

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的

SDUT 2403-单峰序列(DP)

单峰序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 明明最近遇到一个数学问题:给定n个数字(A1,A2,A3......An),每个数字均是小于2^31的正整数,现需要知道这n个数字中的最长单峰子序列长度是多少.所谓单峰序列是指满足如下条件之一的子序列: (1)Ak1<Ak2<Ak3<......<Akm (k1,k2,k3....km均在1到n之间) (2)Ak1>Ak2>Ak3>...

19_05_21校内训练[简单序列]

题意 定义一个序列的价值为其排序后所有位置(从1开始)乘以该位置元素的值的和,即∑i*ai.求一个长度为n的序列的所有连续子序列的价值和. 思考 一个序列的价值可看做所有的元素的和,加上所有无序二元组中较大的元素的值. 因此答案分为两部分:1.所有可能序列的元素和的和.考虑一个点,算出有多少区间包含它既可. 2.无序二元组较大的元素的值.不难得出两个点之间的贡献是线性的,因此用树状数组维护所有小于等于某个数的位置和既可.正反各做一遍. 代码 1 #include<bits/stdc++.h>

如何理解“字符串是一组由16位组成的不可变的有序序列”

疑惑点: 1.16位 2.不可变 3.有序序列 解惑: 1.16位指的是:字符串每个字符所占用的空间为16bits 比特(2 bytes);这是因为JS采用的是unicode编码,每个字符需要2个字符. 2.不可变指的是: 字符串对象一旦创建出来,便不能被更改.这可能有些难理解,但事实确实如此.你可能会认为s+='1' 只是在 s 后面增加一个元素 1 而已,但事实是: 先将 s 拷贝一份,记为 temp 在 temp 末尾加上'1' 将 s 变量指向 temp,并删去原来的s 这一特性,可以从

BZOJ 3992 【SDOI2015】 序列统计

题目链接:序列统计 我来复习板子了--这道题也是我写的第一发求原根啊? 求原根方法: 从小到大依次枚举原根.设当前枚举的原根为\(x\),模数为\(p\),\(p-1\)的质因数分别为\(p_1,p_2,\dots,p_m\),则只需检验\(x^{\frac{p}{p_i}}\equiv1 \pmod{p}\)是否成立即可.如果成立则\(x\)不是原根. 然后这道题朴素\(dp\)就不讲了.设\(m\)的原根为\(g\),那么把每个数表示成\(g^k\)的形式就可以乘法变加法了,就成为了\(NT