ios数据持久化之归档(Archives)和序列化(Serializations)

本文介绍了iOS应用中数据的归档和序列化方法,包括自定义对象的归档过程及使用NSKeyedArchiver进行序列化的步骤。同时探讨了属性列表(plist)文件的使用,并详细解释了UserDefaults的工作原理。
摘要由CSDN通过智能技术生成


转自:  http://geeklu.com/2012/01/ios-persistence/

2. 归档(Archives) 和 序列化(Serializations)

我们经常听到“序列化”,“反序列化”这样的字眼,其实“序列化”的意思就是将对象转换成字节流以便保存或传输,“反序列化”便是一个相反的过程,从字节流转到对象。

在这节中涉及到一种文件类型plist,plist就是Property List 的缩写,即所谓的属性列表,属性列表有两种数据格式,一种是XML的,方便阅读和编辑;另一种是二进制的,节省存储空间,以及提高效率。

在Objective-C中这个对象和字节流的互转分成两类:

  • 归档 普通自定义对象和字节流之间的转换
  • 序列化 某些特定类型(NSDictionary, NSArray, NSString, NSDate, NSNumber,NSData)的数据和字节流之间(通常将其保存为plist文件)的转换

2.1 归档

如果我们需要将自定义的一个对象保存到文件,应该如何做呢?
这里引入两个东西:一个是NSCoding协议 ;另一个是NSKeyedArchiver,NSKeyedArchiver其实继承于NSCoder,可以以键值对的方式将对象的属性进行序列化和反序列化。
具体的过程可以这样描述 通过NSKeyedArchiver 可以将实现了NSCoding协议的对象 和 字节流 相互转换

像一些框架中的数据类型如NSDictionary,NSArray,NSString... 都已经实现了NSCoding协议,所以可以直接对他们进行归档操作。NSDictionary和NSArray会直接写成plist文件。

2.2.1 序列化的方式

序列化可以通过两种途径来进行

使用数据对象自带write方法写文件


使用NSPropertyListSerialization类
通过NSPropertyListSerialization类可以将数据对象直接转成NSData或者直接写到文件或者流中去

NSMutableDictionary *dataDictionary = [[[NSMutableDictionary alloc] init] autorelease];
[dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"];
[dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];

NSString *error;
NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:dataDictionary
                                                           format:NSPropertyListXMLFormat_v1_0
                                                 errorDescription:&error];
if(xmlData) {
    NSLog(@"No error creating XML data.");
    [xmlData writeToFile:@"/Users/Luke/Desktop/test2.plist" atomically:YES];
}
else {
    if (error) {
        NSLog(@"error:%@", error);
        [error release];
    }
}

读取

 NSDictionary *dictionaryFromFile = (NSDictionary *)[NSPropertyListSerialization 
                                                       propertyListWithData:[NSData dataWithContentsOfFile:@"/Users/Luke/Desktop/test2.plist"] 
                                                        options:0
                                                        format:NULL
                                                        error:&error];

2.2.2 User Defaults

User Defaults 顾名思义就是一个用户为系统以及程序设置的默认值。每个用户都有自己的一套数据,用户和用户之间没法共享的。

我们都知道每一个程序都会保存一些设置数据,比如记住上次窗口的位置和大小,记住是否弹出某些提示信息等。苹果提供了一个统一的解决方案,就是每一个app都有一个plist文件专门用以保存偏好设置数据。plist文件名默认是程序Bundle identifier,扩展名为plist.

除了程序自己的设置外,系统还有一些全局的或者其它的一些设置,也属于User Defaults的范畴,User Defaults的持久化数据都保存在 ~/Library/Preferences 目录中.

这里有一点简要的说一下,User Defaults 中存放的key value分放在多个Domain中,取的时候按一定的次序取查找,次序如下:

  • The Argument Domain 程序启动的时候以参数的方式传入的
  • The Application Domain 通过NSUserDefaults往里面写数据的时候默认就是写到这个Domain的,通过Bundle identifier来标识
  • The Global Domain 用户的全局的设置(系统的偏好设置)会放在这个Domain下,比如用户的语言设置,滚动条的设置等,里面的设置会对所有的程序起作用。
  • The Languages Domains
  • The Registration Domain 这个domain里面的key value是提供默认值的,一般会在程序启动的设置进行设置,他们都不会被持久化到文件的。当某个key对应的值在上面的那些domain中都不存在的时候,就到这里找。

Mac系统还为user defaults提供了很好的命令行工具,defaults 你可以通过下面的方式查看具体使用方式

man defaults

可以通过defaults domains查看当前用户的所有的domain,通过 defaults read NSGlobalDomain 读取 The Global Domain 中的所有值。

NSUserDefaults 类来读写Preferences设置,而无需考虑文件位置等细节问题。

NSUserDefaults 用起来和 NSDictionary 很相似,多了一个Domain的概念在里面。NSUserDefaults 一样提供了一个获取单例的方法.

+ (NSUserDefaults *)standardUserDefaults

NSUserDefaults提供了一系列的接口来根据key获取对应的value,搜索的次序按照上面提及到的次序在各个Domain中进行查找。还提供了一系列的 Setting Default Values的方法,这些设置的值都是在 The Application Domain 下的.当然也提供了修改其他Domain下的值的方法,只是需要整体的设置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值