当前位置: 首页 > news >正文

使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。
[NSKeyedArchiver archiveRootObject:account toFile:path];和`c
PPAccountModel *account = [NSKeyedUnarchiver unarchiveObjectWithFile:path];


```c
'archiveRootObject:toFile:' is deprecated: first deprecated in iOS 12.0 - Use +archivedDataWithRootObject:requiringSecureCoding:error: and -writeToURL:options:error: instead
'unarchiveObjectWithFile:' is deprecated: first deprecated in iOS 12.0 - Use +unarchivedObjectOfClass:fromData:error: instead

替换很简单,但是会一堆问题等着你解决,序列化和反序列全失败。
先说能简单解决的序列化(归档):

    NSString *path = [self PathWithFileName:@"啊啊啊.data"];//拓展名可以自己随便取DYGlobleData.token = @"";PPAccountModel *account = nil;
//    [NSKeyedArchiver archiveRootObject:account toFile:path];NSError *error = nil;NSData *archiveData = [NSKeyedArchiver archivedDataWithRootObject:account requiringSecureCoding:YES error:&error];if (archiveData == nil || error) {NSLog(@"归档失败:%@", error);}BOOL isSuccess = [archiveData writeToFile:path atomically:YES];if(!isSuccess){NSLog(@"归档存储失败:%d", isSuccess);}

简单吧!也不是很复杂。首先失败的提示信息如下:

Error Domain=NSCocoaErrorDomain Code=4866 "未能写入数据,因为它的格式不正确。" UserInfo={NSUnderlyingError=0x2835675a0 {Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'PPAccountModel' does not adopt it." UserInfo={NSDebugDescription=This decoder will only decode classes that adopt NSSecureCoding. Class 'PPAccountModel' does not adopt it.}}}

这是啥鬼?搞了半天查出来了,是序列化时采用了requiringSecureCoding为YES。但是序列化的类采用的是NSCoding协议,可以设置成NO,这样能序列化成功,但是反序列化就不能保证怎么样了。那就遵循NSSecureCoding协议吧!改造也很简单,在头文件换成NSSecureCoding,在实现文件写上supportsSecureCoding函数具体代码:

@interface PPAccountModel : NSObject<NSCoding>
+ (BOOL)supportsSecureCoding {return YES;
}

遇到空数组序列化失败:

[aCoder encodeObject:[NSMutableArray array] forKey:@"usersAvatar"];

修改为:

    if(isCommonUnitEmptyArray(self.usersAvatar)){[aCoder encodeObject:@"" forKey:@"usersAvatar"];}else{[aCoder encodeObject:self.usersAvatar forKey:@"usersAvatar"];}

也很简单啊!序列化搞定。
反序列化坑更多。序列化成功但是反序列化错误:
反序列化:

//得到用户信息
-(PPAccountModel *)getAccountInfo;
{FLDDLogDebug(@"函数");NSString *path = [self PathWithFileName:@"啊啊啊.data"];//拓展名可以自己随便取
//    PPAccountModel *account = [NSKeyedUnarchiver unarchiveObjectWithFile:path];// NSData转array,转dictionary,转NSStringNSError *err = nil;NSData *archiveData = [NSData dataWithContentsOfFile:path];if(!archiveData){return nil;}PPAccountModel *account = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[NSArray.class,NSDictionary.class, NSString.class, UIFont.class, NSMutableArray.class, NSMutableDictionary.class, NSMutableString.class, UIColor.class, NSMutableData.class, NSData.class, NSNull.class, NSValue.class,NSDate.class, XQUserModel.class, NSNumber.class, PPAccountModel.class, XQTimeMapModel.class]] fromData:archiveData error:&err];_account = account;if (archiveData == nil || err) {NSLog(@"反序列化失败:%@", err);}
//    if((account == nil) || (kUserLogin))NSLog(@"account = %@",account);if(account == nil){
//        [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kLoginStateKey];
//        [[NSUserDefaults standardUserDefaults] removeObjectForKey:kLoginToken];
//        [[NSUserDefaults standardUserDefaults] synchronize];self.isLogin = NO;DYGlobleData.token = @"";[BITSingleObject sharedInstance].token = @"";}else{self.isLogin = YES;[BITSingleObject sharedInstance].token = account.token;DYGlobleData.token = account.token;[account fetchRoleData];}return account;
}

首先保证把参与序列化的所有对象类型都列举出来,写少了就4865 错误。但是全部列举万了还是4865错误,错误信息如下:

object c  -[NSKeyedUnarchiver decodeObjectForKey:]:    missing class information for object

到处查资料也没有查到解决方案,我试了半天我快放弃了,才找到原因。因为序列化的用户信息是反序列化后给单例对象了,这个用户信息增加了一些不需要序列化的成员变量,把它当用户相关的单例成员变量了,没有实现序列化和反序列化。我把这些变量去掉或序列化就反序列化正常了。
注意:子类的序列化和反序列化时需要把父类的变量也序列化和反序列化。

相关文章:

使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

为何archiveRootObject和unarchiveObjectWithFile正常&#xff0c;而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path];和c PPAccountModel *account [NSKeyedUnarchiver unarchiveObjectWithFile:…...

python获取鼠标出颜色

import pyautogui as pg import keyboarddef rgb2hex(r, g, b):return #{:02x}{:02x}{:02x}.format(r, g, b)try:width, height pg.size()print(f"Display resolution: {width} * {height}\n") # 打印屏幕分辨率print(按下shift键打印出鼠标所指位置的颜色......)w…...

Github Flow工作流简单介绍(以部署为中心的开发模式)

前言 这篇文章主要介绍Github Flow的理念&#xff0c;以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式&#xff0c;通过简单的规则&#xff0c;持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型&#xff0c;它提供了一种更灵活…...

selenium浏览器驱动下载

Chrome谷歌浏览器 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的chromedriver.exe 版本也不一样&#xff0c;下载时不要搞错了。 如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。 Firefox火狐浏览器 驱…...

go学习 模块与包 - Init函数 - 如何导入第三方包 - 切片与数组的数据传递方式 - go中文件的读写

目录 包&#xff08;package&#xff09;是组织和复用代码的基本单元。 包的种类&#xff1a; 包的导入 包的组成 如下两个文件中定义了A变量和 sc_num变量&#xff0c;他们的首字母开头分别为大写和小写&#xff0c;因此可以说明A变量是公有变量&#xff0c;而sc_num是私…...

2023第五届全国生物资源提取与应用创新论坛即将举办

01、会议背景 为进一步加强生物资源提取行业交流与合作&#xff0c;促进业“产学研用”融合&#xff0c;提升行业科技创新水平&#xff0c;增强行业国际竞争力&#xff0c;中国生物发酵产业协会、浙江科技学院、浙江工业职业技术学院、浙江省农业生物资源生化制造协同创新中心&…...

Socks5代理在爬虫与HTTP应用中的重要性

IP代理的类型及原理常见的IP代理类型有HTTP代理、Socks代理等&#xff0c;本文重点关注Socks5代理。Socks5代理是一种网络协议&#xff0c;可以实现传输层的数据转发&#xff0c;使客户端在不直接连接服务器的情况下与其进行通信。其原理在于接收客户端的请求&#xff0c;然后将…...

二叉树详解

这里写目录标题 前言树型结构(了解)树常见的概念树的表示形式&#xff08;了解&#xff09;树的应用 二叉树概念两种特殊的二叉树二叉树的性质(重要)二叉树的存储二叉树的基本操作 前言 本篇博客讲述了以下几个知识点 树的基本概念二叉树概念及特性二叉树的基本操作 树型结构…...

Git的核心概念:探索Git中的提交、分支、合并、标签等核心概念,深入理解其作用和使用方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…...

JAVA设计模式——23种设计模式详解

一、什么是设计模式&#x1f349; 设计模式&#xff08;Design pattern&#xff09; 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目…...

Oracle输出文本平面(CSV、XML)文本数据详细过程

此过程是提供给前端,调用的接口,为报表提供”下载“功能。以下是本人在测试环境的测试,有什么不足的地方,请留言指教,谢谢。 1、测试表 分别对测试表输出csv、xml两种格式文件数据。前期的准备工作。 --在服务器端创建directory,用管理员用户 create or replace directo…...

基于C++的QT基础教程学习笔记

文章目录&#xff1a; 来源 教程社区 一&#xff1a;QT下载安装 二&#xff1a;注意事项 1.在哪里写程序 2.如何看手册 3.技巧 三&#xff1a;常用函数 1.窗口 2.相关 3.按钮 4.信号与槽函数 5.常用栏 菜单栏 工具栏 状态栏 6.铆接部件 7.文本编辑 8…...

【数据分享】全国地级市1999—2020年工业企业数(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2022年《中国城市统计年鉴》整理的1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额&#xff08;可查看之前的…...

设计模式【行为型】-- 责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象依次处理同一个请求&#xff0c;形成一条责任链。当客户端提交一个请求时&#xff0c;请求沿着责任链传递&#xff0c;直到有一个处理者能够处理该请求为止。…...

[Spring] 三级缓存解决循环依赖详解

什么是循环依赖 注册一个bean对象的过程&#xff1a; Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法&#xff0c;反射&#xff0c;得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…...

gerrit 从安装到出坑

一般公司在做代码审核的时候选择codereview gerrit来处理代码的入库的问题。 它是通过提交的时候产生Change-Id: If4e0107f3bd7c5df9e2dc72ee4beb187b07151b9 来决定是不是入库&#xff0c;一般如果不是通过这个管理&#xff0c;那么就是我们通常的操作 git add . git comm…...

Java工程师就业前景怎么样?能拿多少工资?

Java软件工程师是指运用Java这个开发工具去完成软件产品的软件程序设计、开发、测试、维护升级等工作的人员。Java程序员可以分为初级、中级、高级、资深等。不同级别的Java程序员&#xff0c;薪资也不一样。 Java除了一般的编程&#xff0c;还可以开发游戏、进行桌面设计、Ja…...

极速跳板机登陆服务器

目录 一&#xff1a;简单登陆跳板器二&#xff1a;一键申请相关的服务器权限三&#xff1a;简化登陆 一&#xff1a;简单登陆跳板器 登陆公司提供的网址&#xff0c; 下载自己的专属RSA密钥。在密钥文件处&#xff0c; 执行登陆指令&#xff1a; ssh -p 36000 -i id_rsa 用户跳…...

【算法与数据结构】226、LeetCode翻转二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题的思路很简单&#xff0c;本质上就是遍历每一个节点&#xff0c;然后交换左右节点。我们可以用前…...

metaRTC6.0 new feature (一)

概要 metaRTC6.0社区版最新版是6.0.212&#xff0c;标准版最新版本是6.0.276&#xff0c;企业版基础版最新版本是6.0.362&#xff0c;在企业版和标准版新增了一些实用功能模块&#xff0c;文件数字证书模块将并入社区版。 New Feature rtsp协议支持 新增rtsp协议&#xff0…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...