iOS NSKeyedArchier序列化遇到的问题

如果需要使用UserDefault归解档,正确的使用方式可以参考如下文章:
http://nshipster.com/nscoding/

问题描述

1、之前使用的项目,只有一个模块,也是主模块,使用UserDefault保存归档解档的信息没有任何问题(其实跟Userdefault关系)
2、归档接档的是自己自定义的对象
3、项目后面需要将每个模块单独提取出去,比如交易模块,用户模块,提取之后,运行项目,归解档就崩溃

归解档崩溃日志

大致就是找不到需要接档的对象
ios - -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class

从详细错误信息中可以了解到
使用模块,或者更改项目名称之后,反序列化解码经常找不到key对应的对象,可以在设置class的时候,加上报错信息的key。比如我的为Projec.USTradeAccountModel。
代码如下:(需要的信息自行替换)
归档需要

NSKeyedArchiver.setClassName("ProjectName.USTradeAccountModel", for: USTradeAccountModel.self)
        NSKeyedArchiver.setClassName("ProjectName.USSecAccountTickerType", for: USSecAccountTickerType.self) // 如果自定义对象中包含子对象,也需要进行设置
        NSKeyedArchiver.setClassName("ProjectName.USBrokerTradePermission", for: USBrokerTradePermission.self)

接档需要

NSKeyedUnarchiver.setClass(USTradeAccountModel.self, forClassName: "ProjectName.USTradeAccountModel")
        NSKeyedUnarchiver.setClass(USSecAccountTickerType.self, forClassName: "ProjectName.USSecAccountTickerType")
        NSKeyedUnarchiver.setClass(USBrokerTradePermission.self, forClassName: "ProjectName.USBrokerTradePermission")

看到另一种简洁的说法
如果存储的对象类名有变动,则需要设置clasName, 方法为:“setClassName:forClass:”
使用 NSKeyedArchiver 进行数据持久化时, 系统会默认使用类名去建表,如果类名变了,那么使用新的类名肯定是从本地获取不到表的,代码执行崩溃。
所以需要在 NSKeyedArchiver 或者 NSKeyedUnarchiver 时使用 “setClassName:forClass:” 指定类名。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 2,775评论 2 10
  • 1、概念 数据持久化-将数据保存在硬盘中,使得机器/应用程序重启后,可以继续访问之前保存的数据。 2、方案 pli...
    中峰阅读 582评论 0 1
  • 前言: 在程序开发中,数据层永远是程序的核心结构之一。对这些数据的加工处理是代码中能体现技术水平的一大模块,比如数...
    麦穗0615阅读 1,476评论 3 22
  • Foundation框架的归档功能 将对象存储转换为二进制序列的过程成为归档、打包或编码,逆变换称为解档、解码或对...
    西门淋雨阅读 1,391评论 0 0
  • 在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代...
    帅不过oneS阅读 628评论 0 1