/*
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. POJ 3107 Godfather (树重心)

    题目链接:http://poj.org/problem?id=3107 题意: 数重心,并按从小到大输出. 思路: dfs #include <iostream> #include < ...

  2. 某考试 T2 bomb

    轰炸(bomb)[题目描述]有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城市i到达城 ...

  3. Delphi Helper Record Class

    unit Unit1; {$DEFINE USESGUIDHELP} interface implementation {$IFDEF USESGUIDHELP} uses System.SysUti ...

  4. 【spring data jpa】使用repository进行查询,使用userRepository.getOne(id)和userRepository.findById(id)无法从数据库查询到数据

    如题: 使用repository进行查询,使用CrudRepository自带的getOne()方法和findById()方法查询,数据库中有这条数据,但是并不能查到. userRepository. ...

  5. alibaba fastjson常见问题FAQ

    English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/al ...

  6. mac 下 virtualbox 配置全网通

    mac下virtualbox实现主机和虚拟机.虚拟机和外网互访的方案 全局添加Host-Only网络 Adapter IPv4 Address:192.168.56.1 IPv4 Network Ma ...

  7. React机制浅析

    在写React代码时,避免不了提前想想页面的结构,当然这也属于HTML布局了,比如哪些组件里需要包含哪些组件.遂突发奇想,如果试着把子组件的render内容替换原组件,会是个啥? 比如拿 https: ...

  8. 开源G711A/PCMA、G711U/PCMU、G726、PCM转码AAC项目EasyAACEncoder

    项目及源码地址:https://github.com/EasyDarwin/EasyAACEncoder EasyAACEncoder 是EasyDarwin开源流媒体服务团队整理.开发的一款音频转码 ...

  9. Vue使用axios

    main.js-------------------   import axios from "axios"; import qs from "qs"; imp ...

  10. 对小程序的网络请求的封装 wx.request 接收参数修改

    wepy-mall/wxRequest.js at master · dyq086/wepy-mall https://github.com/dyq086/wepy-mall/blob/master/ ...