文档章节

runtime序列化与反序列化

小鹏GG丶
 小鹏GG丶
发布于 06/14 18:26
字数 380
阅读 5
收藏 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
博文 13
码字总数 8305
作品 0
程序员
序列化框架比较:kryo & hessian & Protostuff & java

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

鉴客
2013/03/04
10.6K
0
对象序列化、反序列化、一键增删改查插件--YUDBModel

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

BruceYu的博客
2017/05/16
85
0
YUDBModel【绿色插件】-对象序列化、反序列化、对象一键增删改查

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

BruceYu的博客
2015/08/21
0
4
DataRow的序列化问题

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

晨曦之光
2012/03/09
139
0
如何序列化与反序列化复杂对象

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

老朱教授
2017/10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
39分钟前
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部