/*
iOS序列化,将对象转成二进制,保存到本地
*/

定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性

@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString *gender;
@end

#import "Person.h"
#import <objc/message.h>

@implementation Person
//编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
  /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
  [aCoder encodeObject:_name forKey:@"name"];
  [aCoder encodeInt:_age forKey:@"age"];
  [aCoder encodeObject:_gender forKey:@"gender"];
  */

  /*利用runtime*/
  unsigned int count = 0;
  Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
  for (int i = 0; i < count; i ++) {
    Ivar ivar = ivars[i]; //得到第i个属性
    const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
    NSString *key = [NSString stringWithUTF8String:paramName];
    //得到属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
    id value = [self valueForKey:key];
    [aCoder encodeObject:value forKey:key]; //把对应的值设置进去
  }
}
//解码
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
  self = [super init];
  if (self) {

    /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
    _name = [aDecoder decodeObjectForKey:@"name"];
    _age = [aDecoder decodeIntForKey:@"age"];
    _gender = [aDecoder decodeObjectForKey:@"gender"];
    */

    /*利用runtime*/
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
    for (int i = 0; i < count; i ++) {
      Ivar ivar = ivars[i]; //得到第i个属性
      const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
      NSString *key = [NSString stringWithUTF8String:paramName];
      //将key对应的属性进行解码
      id value = [aDecoder decodeObjectForKey:key];
      //设置属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
      [self setValue:value forKey:key];
    }
  }
  return self;
}

runtime之实现对象序列化的更多相关文章

  1. C#对象序列化与反序列化zz

      C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...

  2. C#对象序列化与反序列化

    C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...

  3. .net对象序列化解析

    一.二进制格式器(Binary Formatter) vs XML格式器(XML Formatter): 下面我先向大家介绍两种不同的格式器,分别用它们如何实现序列化机制和反序列化机制,请看下面的代码 ...

  4. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  5. [转载]C#对象序列化与反序列化

    文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...

  6. .net的XML对象序列化VS WCF中xml序列化问题

    整理一下 .net 对象序列化注意事项: 1. 字段:必须是 public类型 2.属性:只读或者只写的属性不被序列化,只有 可读可写并且赋值的才可以 序列化: Someclass obj = new ...

  7. .Net高级技术——对象序列化

    对象序列化 “序列化是将一个对象保存到存储介质上或者将对象进行转换使之能够在网络上传送的行为”.通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是从文件或者数据库中取出数 ...

  8. C# 把对象序列化 JSON 字符串 和把JSON字符串还原为对象

    /// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...

  9. WCF学习笔记——对象序列化

    当试图通过Web服务.WCF这样的远程处理技术将一个对象复制到远端时,具有对类型序列化的能力很关键. 一 序列化基础 序列化描述了持久化或传输一个对象的状态到流的过程(.NET将对象序列化到流,流是字 ...

随机推荐

  1. k8s之nginx-ingress、 Daemonset实现生产案例

    上一篇中用node ip + 非80端口,访问k8s集群内部的服务.实际生产中更希望用node ip + 80端口的方式,访问k8s集群内的服务. # 修改mandatory.yaml中创建控制器部分 ...

  2. java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page pagehelper报错无法类型转化。

    报错信息: 严重: Servlet.service() for servlet [springmvc] in context with path [] threw exception [Request ...

  3. Oracle 实例名/服务名 请问SID和Service_Name有什么区别

    可以简单的这样理解:一个公司比喻成一台服务器,数据库是这个公司中的一个部门. 1.SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字, 就好像一个部门里,每个人 ...

  4. 我是如何通过CSRF拿到Shell的

    织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有 ...

  5. Ubuntu 安装 spark

    环境: Unbunt 12.04 Hadoop 2.2.x Sprak 0.9 Scala scala-2.9.0.final.tgz 步骤 1. 下载 scala 2. 解压scala,然后改动/e ...

  6. c# 时间相关

    1.求时间差,两种方式(时间是否小于1800秒) 第一种: DateTime startTime = DateTime.Now; ... DateTime.Now.Subtract(startTime ...

  7. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  8. Qt5的插件机制(6)--开发Qt插件时几个重要的宏

    怎样开发Qt插件,能够在Qt Assistant 中搜索"Qt Plugins"或"How to Create Qt Plugins",看看那篇manual中的 ...

  9. 笔记11 export to excel

    参考两篇博客:http://blog.csdn.net/zyming0815/article/details/5939104 http://blog.csdn.net/g710710/article/ ...

  10. bash 的环境配置文件

    http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行 ...