文档章节

NSCoding

小春0618
 小春0618
发布于 2014/12/26 16:18
字数 1158
阅读 7
收藏 0

由于Sqlite数据库的blob数据和NSData的兼容比较好,我想尝试把一个NSArray存入Sqlite。Sqlite不支持数组的直接存储,所以我寻找了一些数组转化为NSData的方法。网上大多数的解决办法都是针对于字符数组,eg:

 NSArray*array01= [[NSArrayalloc]initWithObjects:@"1",@"2",@"3",nil];

这种数组的解决办法很简单,循环遍历数组,然后把每次取出的NSString转码成NSData类型,然后对最终的NSData数据进行一次次的循环拼接,实现把数组中所有的字符串拼接成一个完整的NSData,eg:

 NSMutableData *data01 =[[NSMutableDataalloc]init];

    for (NSString *str in array01) {

       NSString*newStr = [str stringByAppendingString:@","];//添加间隔,为了区分数组的每个元素

       NSData *temp =[newStr dataUsingEncoding:NSASCIIStringEncoding];//创建中间变量存储将nsstring转码成nsdata的数据

       [data01 appendData:temp];//data数据拼接到最终数据data01

       [temp release];

    }

这样就实现了一个NSArray字符数组到NSData的转换。转换回来也很简单,把NSData转换成NSString,然后将NSString分割(这也就是我们为str添加末尾“,”的原因),eg:

 

     NSString *string01 = [[NSString alloc]initWithData:data01 encoding:NSUTF8StringEncoding];//NSData数据转换成NSString类型数据

    NSArray *array02 = [string01 componentsSeparatedByString:@","];//字符串根据@“拆分成一个数组,将数组还原

        但是这样太麻烦了,经过了这么多次转换,我就在思考有没有更简单的方法,NSData和NSArray的直接转换。无意间看到了一个网站,我看到了一个方法,运用的是“归档”,下面我们来说一下这个方法的实现,eg:

 

NSData *data02 = [NSKeyedArchiver archivedDataWithRootObject:array01];//通过归档对NSArray进行转码,保存了数组的序列

一句代码就完成了!而且还保存了数组的有序性。转换回去也同样是一句话哦:),eg:

 

    NSArray *array02 = [NSKeyedUnarchiver unarchiveObjectWithData:data02];//通过发归档进行NSData反转码,返回有序列的数组

是不是很方便呢??不是很,是太方便了吧。但是这个时候问题又来了,我如果在数组里存放的不是NSString类型的对象呢,如果存了自定义的类,是否也可以自动跳转呢?(有点异想天开。。),于是我自己创建了一个Student类,尝试相同的方式转换,发现程序无法运行了,问了同事,他告诉了我这个秘密。原来所有原生的类都是实现了NSCoding协议,在归档的过程中进行了转码,所以才可以归档成功。我研究了一下NSCoding协议,下面是API给我们的信息:

 

NSCoding Protocol Reference

encodeWithCoder:

Encodes the receiver using a given archiver. (required)

- (void)encodeWithCoder:(NSCoder *)encoder

Parameters
  • encoder

  • An archiver object.

Availability
  • Available in iOS 2.0 and later.

Declared In

NSObject.h

initWithCoder:

Returns an object initialized from data in a given unarchiver.(required)

- (id)initWithCoder:(NSCoder *)decoder

Parameters
  • decoder

  • An unarchiver object.

Return Value

self, initialized using the datain decoder.

Availability
  • Available in iOS 2.0 and later.

Declared In

NSObject.h

NSCoding协议中只有两个方法,都是require的方法,一个是把本身的类进行转码,一个是逆转换成类对象,返回一个对象,我们实战一下这个协议的用法,看看是否好用,首先写一个自定义Student类:

@interfaceStudent : NSObject<NSCoding>

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *ID;


-(Student *)initWithName :(NSString*)newName 

                 and : (NSString *)newID;

@end

Student类需要实现协议NSCoding,.m文件中是这样的:

 

@implementationStudent

@synthesize name = _name,ID = _ID;

 

//初始化学生类

-(Student *)initWithName:(NSString *)newName and:(NSString *)newID{

   self = [super init];

   if (self) {

       self.name = newName;

       self.ID= newID;

    }

   return self;

}

//学生类内部的两个属性变量分别转码

-(void)encodeWithCoder:(NSCoder *)aCoder{

   [aCoder encodeObject:self.name forKey:@"name"];

   [aCoder encodeObject:self.IDforKey:@"ID"];

}

//分别把两个属性变量根据关键字进行逆转码,最后返回一个Student类的对象

-(id)initWithCoder:(NSCoder *)aDecoder{

   if (self = [super init]) {

       self.name = [aDecoder decodeObjectForKey:@"name"];

       self.ID= [aDecoder decodeObjectForKey:@"ID"];

    }

   return self;

}


@end


自定义类Student实现了NSCoding协议以后,就可以进行归档转换了,具体实现:

 

   Student *stu1 = [[Student alloc]initWithName:@"124" and:@"111"];//学生对象stu1

   Student *stu2 = [[Student alloc]initWithName:@"223" and:@"222"];//学生对象stu2

   NSArray *stuArray =[NSArray arrayWithObjects:stu1,stu2, nil];//学生对象数组,里面包含stu1stu2


   NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stuArray];//归档

   NSLog(@"data = %@",stuData);

   NSArray *stuArray2 =[NSKeyedUnarchiver unarchiveObjectWithData:stuData];//逆归档

   NSLog(@"array2 = %@",stuArray2);

运行结果如下:

 

2012-09-25 10:44:24.944MagazineDemo[720:f803] data = <62706c69 73743030d4010203 0405082b 2c542474 6f705824 6f626a65 63747358 2476657273696f6e 59246172 63686976 6572d106 0754726f 6f748001 aa090a1117181920 24252655 246e756c 6cd20b0c 0d105a4e 532e6f62 6a65637473562463 6c617373 a20e0f80 02800680 09d31213 0c141516 524944546e616d65 80048003 80055331 32345331 3131d21a 1b1c1f58 24636c6173736573 5a24636c 6173736e 616d65a2 1d1e5753 74756465 6e74584e534f626a 65637457 53747564 656e74d3 12130c21 22168008 8007800553323233 53323232 d21a1b27 2aa22829 574e5341 72726179 584e534f626a6563 74574e53 41727261 79120001 86a05f10 0f4e534b 6579656441726368 69766572 00080011 0016001f 00280032 0035003a 003c0047004d0052 005d0064 00670069 006b006d 00740077 007c007e 008000820086008a 008f0098 00a300a6 00ae00b7 00bf00c6 00c800ca 00cc00d000d400d9 00dc00e4 00ed00f5 00fa0000 00000000 02010000 00000000002d0000 00000000 00000000 00000000 010c>

2012-09-25 10:44:24.944MagazineDemo[720:f803] array2 = (

   "<Student: 0x6883490>",

   "<Student: 0x68dd3c0>"

)

成功啦:)自定义类Student转码成功.

本文转载自:http://blog.csdn.net/likendsl/article/details/8513733

小春0618
粉丝 8
博文 40
码字总数 10552
作品 0
海淀
程序员
私信 提问
NSData与NSString

NSdata的概念 1、使用文件时需要频繁地将数据读入一个临时存储区,它通常称为缓冲区 2、NSdata类提供了一种简单的方式,它用来设置缓冲区,将文件的内容读入缓冲区,或者将缓冲区内容写到一个...

yoyoso
2014/12/23
235
0
IOS 序列化与反序列化NSKeyedUnarchiver

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

今日竹石
2014/01/23
5.7K
0
iOS 持久化: Objective-C 和 Xamarin.iOS-Monotouch 的 NSCoding

介绍 应用存储数据。由于无可非议,因为它涉及一份声明。如何在不同的平台上存储数据保持长的效果涉及和经常无聊的谈话,如果在回来的路上数落我和我的同事嘻嘻哈哈,无所事事。 然而iOS库能...

oschina
2013/10/18
778
0
runtime序列化与反序列化

使用简单的数据存储有时候需要用到 NSCoding协议 实现其 encodeWithCoder 与 initWithCoder 方法 一般实现的姿势是这样的: 但是这样会有一个缺陷, 如果我们想加一个属性, 就要再在NSCoding代...

小鹏GG丶
2018/06/14
7
0
OC单个对象的归档和解归档

FJIdol.h #import <Foundation/Foundation.h> //遵守NSCoding协议:需要实现协议方法 @interface FJIdol : NSObject <NSCoding> @property (nonatomic,copy) NSString *name; @property (nona......

鹿微微鹿
2016/03/30
21
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
9
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
5
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部