序列化 NSKeyedArchiver,NSPropertyListSerialization

到目前为止,看到oc实现的序列化方式有两种:NSKeyedArchiver,NSPropertyListSerialization。

在这两种序列化方式中,NSData都是序列化的目标。两种方式的不同点在于NSPropertyListSerialization只是针对字典类型的,而NSKeyedArchiver是针对对象的。(补充一下,在Mac OS环境下,还可以使用NSArchiver获得更加精简的二进制序列化内容,但是NSArchiver在iOS环境下不支持)。

首先讲NSPropertyListSerialization,这个相对简单,只要创建一个NSDictionary,然后调用NSPropertyListSerialization dataFromPropertyList, 将内容写入NSData中就可以了。如果要读入,就调用propertyListFromData.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

NSString * filepath = @”…”;//omitted.

NSString * err;//不需要初始化。如果有错误发生,会被复制。

NSDictionary * props = [NSDictionary dictionaryWithObjectsAndKey:@”Lucy”, @"name”,

            @"Beijing, China”, @"city”,

            @"supervior”, @"position”,

            @"Qitiandasheng”, @"company”, nil];

NSData * data = [NSPropertyListSerialization dataFromPropertyList:props

        format:NSPropertyListXMLFormat_v1_0

        errorDescription:&err];

if(!err){

    [data writeToFile:filePath atomically:YES];//写入文件

}else{

    NSLog(@"error with:%@", err);

}

然后再来看NSKeyedArchiver。从基本的代码示例来看也很简单:


1

2

3

4

5

Person  * lucy  = [[Person alloc] initWithName:@"lucy"];

lucy.address = @"Beijing, China";

NSData * data = [NSKeyedArchiver archiveDataWithRootObject:lucy];

[data writeToFile:filePath];

这里要求Person类必须事先了NSCoding协议。NSCoding协议中包含两个必须事先的方法initWithCoder和encodeWithCoder. 参考下面这两个方法的实现:


1

2

3

4

5

6

7

8

9

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

    [aCoder encodingObject:[NSNumber numberWithInt:self.age] forKey @"age"];

}

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

    if(self=[super init]){

        self.age = (int)[(NSNumber*)[aDecoder decodeObjectForKey:@"age"] intValue];

    }

    return self;

}

这里之所以用int age作为序列化属性的示例,是为了引出另一个话题,就是在序列化时对基础类型的处理。NSCoder中是不能存储基础类型的,包括int,float,char *什么的。要将这些进行序列化,必须要进行封装。

一般封装有两种方式。对于数值基本类型,使用Cocoa提供的封装,NSNumber就可以了。对于定长的struct,要分情况,如果struct的所有类型都是定长,并且成员中没有struct类型,那么可以直接使用NSValue来封装;否则,需要自己想办法进行key-value编写。char * 应该直接使用NSString进行封装。

时间: 2024-10-21 14:47:52

序列化 NSKeyedArchiver,NSPropertyListSerialization的相关文章

[精通Objective-C]归档和序列化

[精通Objective-C]归档和序列化 参考书籍:<精通Objective-C>[美] Keith Lee 使用Foundation框架的归档和序列化类可以将对象(对象图)转换为具有独立结构的字节缓冲区.这样就可以将数据写入文件或者传送给其他进程(通常会通过网络).之后,这些数据可能会被转换回对象并保留相关的对象图.这些类为数据持久化提供了轻量级技巧.序列化处理类能够保存数据和对象在其层次结构中的位置,而归档处理类具有更广泛的用途,它们可以保存数据.数据类型和对象层次结构中对象之间的关系.

数据缓存方案

数据缓存方案 by 伍雪颖 今天考虑一个适合自己项目的缓存方案,基本都实验了下(以前一直用CoreData) 1.coredata,用MagicalRecord+Mogenerator 要建表,还要写好多解析代码,果断不用,好麻烦 2.序列化 [NSKeyedArchiver archiveRootObject:model toFile:path]; [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 好方便,不过总感觉体验不好,测了下方法时间,当

iOS开发——数据持久化OC篇&amp;文件系统总结

文件系统总结 包系统 就是app程序本身,其实是个zip包,资源/可执行文件 都在里面 + (NSBundle *)mainBundle 得到程序本身的bundle类. NSBundle提供了很多path相关函数 运行期只读,不可写 没有必要建立子文件夹,苹果不推荐在包中建立子文件夹 + (UIImage *)imageNamed:(NSString *)name 可以直接加载包中的图片文件 包中带有的数据不能太多,不然不利于用户安装 NSBundle pathForResource:ofTyp

iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化

Java代码   /** 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除 */ NSArray *paths1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomai

IOS文件操作和自定义对象的归档(序列化)、反归档(反序列化)

IOS对文件操作包含文件的创建,读写,移动,删除等操作. 1.文件的创建: //设定文本框存储文件的位置 NSString *strFilePath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; //指定存储文件的文件名 NSString *fileName=[strFilePath stringByAppendingPathComponent:@

NSCoding序列化

一个类用于存储获取的用户登陆信息,让这个类实现NSCoping Protocol.然后实现协议里面的 required init?(coder aDecoder: NSCoder)方法和 func encodeWithCoder(aCoder: NSCoder)方法.然后就可以用 let data = NSKeyedArchiver.archivedDataWithRootObject(someObj)方法得到NSData对象,可以直接写入文件,或者直接NSStardardDefaults.se

iOS 数据序列化,NSCoding, NSCoder

iOS可以利用NSKeyedArchiver类将对象序列化成NSData存储在磁盘上,但前提是该对象所属的类必须遵从NSCoding协议. NSCoding协议包含两个方法,要序列化的类必须实现它们 - (void)encodeWithCoder:(NSCoder *)aCoder; //序列化的时候将数据encode (将数据编码) - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // 反序列化的时候将数据decode (

初级数据持久化NSKeyedArchiver(二)

看代码: 1 #import "MainViewController.h" 2 #import "Student.h" 3 4 @interface MainViewController () 5 6 @end 7 8 @implementation MainViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 // Do any additional setup after loa

IOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等) 下面主要来介绍一个归档NSKeyedArchiver. 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象. 归档方式: 对Foundation框架中对象进行归档 对自定义的内容进行归档