iOS的数据序列化(又称持久化)的两类使用方式

简介: iOS的数据序列化(又称持久化)的两类使用方式

java,mac,object c都有各自的序列化保存方法。

现在介绍下iOS的数据序列化保存。

一般分为用单例来实现数据的序列化保存和用对象来实现数据的序列化保存。

第一类:用单例来实现数据的序列化保存。

用户登录数据的序列化保存一般使用单例来实现,根据是否有登录信息来决定是到登录页面还是到其它页面。

它通常包含获取用户信息,得到用户信息(读取文件),清理用户信息,保存用户信息,用户相关字段,根据服务器返回的数据字典初始化单例数据。

头文件:GlobalSingle.h

import

import

import

import “GlobalSingle.h”

@interface GlobalSingle()
@end
@implementation GlobalShare
static GlobalSingle *singleUserData = nil;
(GlobalSingle*)getGlobalSingle {
if (singleUserData == nil) {
singleUserData = [[super allocWithZone:NULL] init];
}
return singleUserData;
}
(id)allocWithZone:(NSZone *)zone {
@synchronized(self)
{
if (singleUserData == nil)
{
singleUserData = [super allocWithZone:zone];
return singleUserData;
}
}
return nil;
}
//为确保 每次返回的都是同一块地址
(id)copyWithZone:(NSZone *)zone {
return self;
}
//清理用户信息
(void)clearUserInfo{
NSString *path = [self PathWithFileName:@”user.archiver”];//拓展名可以自己随便取
User *user = nil;
[NSKeyedArchiver archiveRootObject:user toFile:path];
_user = nil;
}
//保存
-(void)saveinfo:(User *)user
{
if(nil != user)
{
NSString *path = [self PathWithFileName:@”user.archiver”];//拓展名可以自己随便取
[NSKeyedArchiver archiveRootObject:user toFile:path];
}
}
//得到用户信息
-(User *)getUserinfo;
{
FLDDLogDebug(@”函数”);
NSString *path = [self PathWithFileName:@”taxiuser.archiver”];//拓展名可以自己随便取
User *user = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return user;
}
// 返回文件路径
(NSString )PathWithFileName:(NSString )fileName
{
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [documents stringByAppendingPathComponent:fileName];
return path;
}
@end
@implementation User
@synthesize sex;
-(id)initWithDictionary:(NSDictionary*)dic
{
if (self=[super init])
{
self.name = [NSString stringWithFormat:@”%@”,dic[@”name”] ==NULL?@”“:dic[@”name”]];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@”name”];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init])
{
self.name= [aDecoder decodeObjectForKey:@”name”];
}
return self;
}
@end

第二类:用对象来实现数据的序列化保存。

上次查询到的消息列表,订单列表等数据,当没有网络时需要显示上次查询的老数据。这些消息列表数据和订单列表数据需要用对象数据的序列化保存。

它通常只需要对需要保存数据model类继承一个子类专门对这些数据进行序列化保存就可以了。

OrderCellModel.h文件

import

import “OrderCellModel.h”

@implementation OrderCellModel
+ (instancetype)parseDataWithDictionary:(NSDictionary *)dict; {
return [[self alloc] initWithDictionary:dict];
}
- (instancetype)initWithDictionary:(NSDictionary *)dict {
if (self = [super init]) {
_orderSNo = dict[@”orderSNo”] == NULL ? @”” : [NSString stringWithFormat:@”%@”,dict[@”orderSNo”]];
}
return self;
}
@end
OrderOperateModel.h文件

import

import “OrderCellModel.h”

@interface OrderOperateModel : OrderCellModel {

}

-(id)initWithDictionary:(OrderCellModel*)model;

OrderOperateModel.m文件

import “OrderOperateModel.h”

@implementation OrderOperateModel
-(id)initWithDictionary:(OrderCellModel*)model
{
if (self=[super init])
{
self.orderSNo = [[NSString alloc] initWithFormat:@”%@”,model.orderSNo];
}
return self;
}
//将对象编码(即:序列化)
-(void) encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.orderSNo forKey:@”orderSNo”];
}
//将对象解码(反序列化)
-(id) initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init])
{
self.orderSNo = [aDecoder decodeObjectForKey:@”orderSNo”];
}
return (self);
}
@end
调用示例:
OrderOperateModel *orderOperateModel = nil;
NSMutableArray *arr = [NSMutableArray array];
for(NSUInteger i = 0; i < dataArr.count; i++)
{
OrderCellModel *model = dataArr[i];
if(![model isKindOfClass:[OrderCellModel class]])
{
return;
}
orderOperateModel = [[OrderOperateModel alloc] initWithDictionary:model];
[arr addObject:orderOperateModel];
}
if(arr.count > 0)
{
NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject:arr];
[tempArchive writeToFile:filePath atomically:YES];
}


目录
相关文章
|
26天前
|
前端开发 数据库
省市区三级联动数据本地序列化和反序列化
省市区三级联动数据本地序列化和反序列化
20 0
|
1月前
|
存储 JSON 数据挖掘
python序列化和结构化数据详解
python序列化和结构化数据详解
24 0
|
1月前
|
JSON NoSQL Java
SpringDataRedis 操作 Redis,并指定数据序列化器
SpringDataRedis 操作 Redis,并指定数据序列化器
27 1
|
1月前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
66 1
|
1月前
|
存储 JSON JavaScript
Python中的JSON与Pickle模块:数据序列化和反序列化的利器
在Python编程中,数据的序列化和反序列化是经常遇到的操作。序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程,而反序列化则是这个过程的逆操作,即将序列化的数据重新转换回原来的数据结构或对象状态。Python中的JSON和Pickle模块就是实现数据序列化和反序列化的强大工具。
|
1月前
|
存储 安全 Java
Java一分钟之-Java序列化与反序列化
【5月更文挑战第14天】Java序列化用于将对象转换为字节流,便于存储和网络传输。实现`Serializable`接口使类可被序列化,但可能引发隐私泄露、版本兼容性和性能问题。要避免这些问题,可使用`transient`关键字、控制`serialVersionUID`及考虑使用安全的序列化库。示例代码展示了如何序列化和反序列化对象,强调了循环引用和未实现`Serializable`的错误。理解并妥善处理这些要点对优化代码至关重要。
26 1
|
1月前
|
JSON 安全 Java
Spring Boot 序列化、反序列化
本文介绍了Spring Boot中的序列化和反序列化。Java提供默认序列化机制,通过实现Serializable接口实现对象到字节流的转换。Spring Boot默认使用Jackson处理JSON,可通过注解和配置自定义规则。然而,序列化可能引发安全问题,建议使用白名单、数据校验和安全库。最佳实践包括使用标准机制、自定义规则及注意版本控制。文章还提醒关注性能并提供了相关参考资料。
96 2
|
1天前
|
网络协议 Java API
【Java】序列化和反序列化
【Java】序列化和反序列化
11 4
|
5天前
|
Java 数据安全/隐私保护 Android开发
Java基础21-读懂Java序列化和反序列化(二)
Java基础21-读懂Java序列化和反序列化(二)
7 1
|
5天前
|
XML 存储 Java
Java基础21-读懂Java序列化和反序列化(一)
Java基础21-读懂Java序列化和反序列化(一)
10 1