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];
}


目录
相关文章
|
11天前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
27 1
|
11天前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
33 2
|
2月前
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
解决C#对Firebase数据序列化失败的难题
|
2月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
2月前
|
存储 分布式计算 Java
|
2月前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
38 7
|
2月前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
43 0
|
4月前
|
NoSQL Redis
redis使用jackson序列化数据配置文件
redis使用jackson序列化数据配置文件
105 5
|
4月前
|
存储 分布式计算 算法
|
4月前
|
存储 Java 应用服务中间件
后端企业级开发之yaml数据序列化格式文件详解2024
后端企业级开发之yaml数据序列化格式文件详解2024
52 0