iOS中的数据序列化与反序列化

梦里花落 2023-08-05 ⋅ 12 阅读

数据序列化是将数据对象转换为可存储或传输的格式,而数据反序列化是将存储或传输的格式转换回数据对象的过程。在iOS开发中,数据序列化与反序列化是非常重要的概念,用于存储和传递数据。本文将介绍iOS中常用的数据序列化与反序列化的方法。

1. JSON序列化与反序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于iOS应用中的数据传输。在iOS中,使用NSJSONSerialization类可以方便地进行JSON序列化与反序列化操作。

JSON序列化

NSError *error;
NSDictionary *data = @{@"name": @"John", @"age": @25, @"city": @"New York"};

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:&error];

if (!error) {
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", jsonString);
}

以上代码将一个NSDictionary对象转换为JSON格式的NSData对象,并将其输出为字符串。使用NSJSONWritingPrettyPrinted选项可以使生成的JSON数据更易读。

JSON反序列化

NSError *error;
NSString *jsonString = @"{\"name\":\"John\", \"age\":25, \"city\":\"New York\"}";

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

if (!error && [jsonObject isKindOfClass:[NSDictionary class]]) {
    NSDictionary *data = (NSDictionary *)jsonObject;
    NSLog(@"%@", data);
}

以上代码将一个JSON格式的字符串转换为相应的NSDictionary对象,并进行输出。

2. Property List(plist)序列化与反序列化

Property List(plist)是一种存储和传输数据的格式,常用于iOS应用中的配置文件和轻量级数据。在iOS中,可以使用NSPropertyListSerialization类进行Property List的序列化与反序列化操作。

Property List序列化

NSError *error;
NSDictionary *data = @{@"name": @"John", @"age": @25, @"city": @"New York"};

NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:data
                                                               format:NSPropertyListXMLFormat_v1_0
                                                              options:0
                                                                error:&error];

if (!error) {
    NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"data.plist"];
    [plistData writeToFile:plistPath atomically:YES];
}

以上代码将一个NSDictionary对象转换为Property List格式的NSData对象,并将其写入到文件中。

Property List反序列化

NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"data.plist"];

NSData *plistData = [NSData dataWithContentsOfFile:plistPath];

NSError *error;
id plistObject = [NSPropertyListSerialization propertyListWithData:plistData
                                                          options:NSPropertyListMutableContainersAndLeaves
                                                           format:NULL
                                                            error:&error];

if (!error && [plistObject isKindOfClass:[NSDictionary class]]) {
    NSDictionary *data = (NSDictionary *)plistObject;
    NSLog(@"%@", data);
}

以上代码将一个Property List格式的文件读取为NSData对象,并进行反序列化操作,得到相应的NSDictionary对象。

3. 归档与解档

归档与解档是另一种常用的数据序列化与反序列化方法,适用于自定义对象的存储和传递。在iOS中,可以使用NSKeyedArchiverNSKeyedUnarchiver类进行归档与解档操作。

归档

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"data.archive"];

Person *person = [[Person alloc] init];
person.name = @"John";
person.age = 25;
person.city = @"New York";

[NSKeyedArchiver archiveRootObject:person toFile:filePath];

以上代码将一个自定义的Person对象进行归档操作,并将归档数据存储到文件中。

解档

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"data.archive"];

Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

if (person) {
    NSLog(@"%@", person);
}

以上代码从文件中读取归档数据,并进行解档操作,得到相应的Person对象。

结论

本文介绍了iOS中常用的数据序列化与反序列化方法,包括JSON序列化与反序列化、Property List序列化与反序列化以及归档与解档。这些方法可以帮助我们在iOS开发中方便地处理数据存储和传输的需求。根据具体的场景和需求,选择合适的数据序列化与反序列化方法是非常重要的。


全部评论: 0

    我有话说: