文档章节

runtime序列化与反序列化

小鹏GG丶
 小鹏GG丶
发布于 06/14 18:26
字数 380
阅读 5
收藏 0
点赞 0
评论 0

使用简单的数据存储有时候需要用到 NSCoding协议 实现其 encodeWithCoder 与 initWithCoder 方法

一般实现的姿势是这样的:

 

但是这样会有一个缺陷, 如果我们想加一个属性, 就要再在NSCoding代理方法里加入属性的序列化和反序列化操作, 否则会很容易导致项目崩溃, 那么有没有一种方式实现NSCOding协议而又不用再修改呢, 这时就需要用到强大的runtime了:

这样写的好处是不管有多少属性, 这两个方法都能通过runtime获取所有属性存取解决, 以后再添加任何属性都不用担心NSCoding协议方法会有问题啦

// copy代码请下拉:

// 归档

- (void)encodeWithCoder:(NSCoder *)aCoder {

    unsigned int count = 0;

    //1.取出所有的属性

    objc_property_t *propertes = class_copyPropertyList([self class], &count);

    //2.遍历的属性

    for (int i=0; i<count; i++) {

        //获取当前遍历的属性的名称

        const char *propertyName = property_getName(propertes[i]);

        NSString *name = [NSString stringWithUTF8String:propertyName];

        //利用KVC取出对应属性的值

        id value = [self valueForKey:name];

        //归档到文件中

        [aCoder encodeObject:value forKey:name];

    }

}

// 解档

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super init]) {

        unsigned int count =0;

        //1.取出所有的属性

        objc_property_t *propertes = class_copyPropertyList([self class], &count);

        //2.遍历所有的属性

        for (int i = 0; i < count; i++) {

            //获取当前遍历到的属性名称

            const char *propertyName = property_getName(propertes[i]);

            NSString *name = [NSString stringWithUTF8String:propertyName];

            //解归档前遍历得到的属性的值

            id value = [aDecoder decodeObjectForKey:name];

            [self setValue:value forKey:name];

        }

    }

    return self;

}

 

© 著作权归作者所有

共有 人打赏支持
小鹏GG丶
粉丝 0
博文 12
码字总数 7547
作品 0
程序员
序列化框架比较:kryo & hessian & Protostuff & java

序列化框架性能对比(kryo、hessian、java、protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf ...

鉴客 ⋅ 2013/03/04 ⋅ 0

对象序列化、反序列化、一键增删改查插件--YUDBModel

YUDBModel 直接实现 json 反序列化对象-对象增删改查数据库-对象序列化的插件 介绍 架构: 使用runtime和Sqlite实现NSObject扩展类YUDBModel,直接实现(json反序列化对象-对象增删改查数据库-...

BruceYu的博客 ⋅ 2017/05/16 ⋅ 0

YUDBModel【绿色插件】-对象序列化、反序列化、对象一键增删改查

一、YUDBModel 介绍 架构: 使用runtime和Sqlite实现NSObject扩展类YUDBModel,直接实现(json反序列化对象-对象增删改查数据库-对象序列化) 易用: 无需继承,直接实现序列化、反序列化、一行代...

BruceYu的博客 ⋅ 2015/08/21 ⋅ 4

DataRow的序列化问题

来源:CSDN 作者:kroll 在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。因此,我们...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

如何序列化与反序列化复杂对象

对象序列化技术在大量数据缓存技术中需要用到,但对于复杂对象,如何实现序列化与反序列化呢? 下面是我写的一个软件中的部分有关序列化的代码,共享之供大家批评,这里展示的是简单的二进制...

老朱教授 ⋅ 2017/10/17 ⋅ 0

C#强化系列文章七:序列化和反序列化

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。 我想最主要...

橘子红了呐 ⋅ 2017/11/05 ⋅ 0

php中序列化与反序列化

把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly');$new = serialize($stooges);p...

Junn ⋅ 2012/11/07 ⋅ 0

基于Json序列化和反序列化通用的封装

1. 最近项目已经上线了 ,闲暇了几天 想将JSON的序列化以及反序列化进行重新的封装一下本人定义为JSONHelp,虽然Microsoft 已经做的很好了。但是我想封装一套为自己开发的项目使用。方便后期...

zsdnr ⋅ 2017/07/21 ⋅ 0

IOS对象操作数据库--YUDBFramework

YUDBFramework 是功能强大、操作简单、轻量级、对象一键操作数据库。 感谢 FMDB DBOBject 使用 runtime + fmdb 封装 1.自动建表 2.自动检查增删表字段 3.自定义数据库名,文件路径 4.支持一对...

BruceYu的博客 ⋅ 2015/08/24 ⋅ 0

msgpack 真的比 protobuf buffers 快 4 倍吗?

hprose serialize Runtime:0.2334s json encode Runtime:15.2883s serialize Runtime:0.7090s msgpack_pack Runtime:0.6883s hprose unserialize Runtime:0.5439s json decode Runtime:24.29......

andot ⋅ 2015/04/18 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux中的端口大全

1 被LANA定义的端口 端口 名称 描述 1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 d...

寰宇01 ⋅ 13分钟前 ⋅ 0

Confluence 6 如何备份存储文件和页面信息

备份的 ZIP 文件包含有 entities.xml,这个 XML 文件包含有 Confluence 的所有页面内容和存储附件的目录。 备份 Zip 文件结构 页面的附件是存储在附件存储目录中的,通过页面和附件 ID 进行识...

honeymose ⋅ 15分钟前 ⋅ 0

【每天一个JQuery特效】根据状态确定是否滑入或滑出被选元素

主要效果: 本文主要采用slideToggle()方法实现以一行代码同时实现以展开或收缩的方式显示或隐藏被选元素。 主要代码如下: <!DOCTYPE html><html><head><meta charset="UTF-8">...

Rhymo-Wu ⋅ 19分钟前 ⋅ 0

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾...

李朝强 ⋅ 24分钟前 ⋅ 0

请不要在“微服务”的狂热中迷失自我!

微服务在过去几年一直是一个非常热门的话题(附录1)。何为“微服务的疯狂”,举个例子: 众所周知,Netflix在DevOps上的表现非常棒。Netfix可以做微服务。因此:如果我做微服务,我也将非常...

harries ⋅ 26分钟前 ⋅ 0

oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享

背景 6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要变化: 基于Spring Boot 2.0.X 不兼容 Spring Boot 1.5.X 期间踩过几个坑,分享出来给大伙,主要是关于...

冷冷gg ⋅ 56分钟前 ⋅ 0

OSChina 周一乱弹 —— 理发师小姐姐的魔法

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @冰冰棒- :分享田馥甄的单曲《My Love》 《My Love》- 田馥甄 手机党少年们想听歌,请使劲儿戳(这里) @Li-Wang :哎,头发又长了。。。又要...

小小编辑 ⋅ 今天 ⋅ 8

Kafka1.0.X_消费者API详解2

偏移量由消费者管理 kafka Consumer Api还提供了自己存储offset的功能,将offset和data做到原子性,可以让消费具有Exactly Once 的语义,比kafka默认的At-least Once更强大 消费者从指定分区...

特拉仔 ⋅ 今天 ⋅ 0

NEO智能合约之发布和升级(二)

接NEO智能合约之发布和升级(一),我们接下来说说智能合约的升级功能。 一 准备工作 合约的升级需要在合约内预先设置好升级接口,以方便在升级时调用。接下来我们对NEO智能合约之发布和升级...

红烧飞鱼 ⋅ 今天 ⋅ 0

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部