博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【iOS】让数据模型实现自动序列化
阅读量:5943 次
发布时间:2019-06-19

本文共 3100 字,大约阅读时间需要 10 分钟。

使用过一段时间后,发现当模型改动,版本升级时不太方便。

前段时间因为写了段自动序列化的代码,分记录下:

原理就是一个根类通过条件反射实现所有数据成员的序列化,其它数据模型继承自它即可

解码实现

-(id)initWithCoder:(NSCoder *)aDecoder{self = [super init];if (self) {id tempClass = [self class];while (tempClass != [NSObject class]) {unsigned int outCount;Ivar * ivars = class_copyIvarList(tempClass, &outCount);for (int i = 0; i < outCount; i++) { //ivars如果是NULL outCount = 0,这里就判断了const char * typeEncode = ivar_getTypeEncoding(ivars[i]); //变量的类型void * data = (char *)self + ivar_getOffset(ivars[i]); //变量的内存地址NSString * name = [NSString stringWithUTF8String:ivar_getName(ivars[i])];//key值if ([self isSaveToDriver:name]) {switch (typeEncode[0]) {case ‘i’:case ‘I’://整型跟无符号整型*(int *)data = [aDecoder decodeIntForKey:name];break;case ‘B’://bool型*(BOOL *)data = [aDecoder decodeBoolForKey:name];break;case ‘c’://字符型*(char *)data = *[aDecoder decodeBytesForKey:name returnedLength:NULL];break;case ‘f’://float*(float *)data = [aDecoder decodeFloatForKey:name];break;case ‘d’://double*(double *)data = [aDecoder decodeDoubleForKey:name];break;case ‘@’://object*(id *)data = [[aDecoder decodeObjectForKey:name] retain];break;case ‘{‘://结构体{NSUInteger sizep;const unsigned char * _data = [aDecoder decodeBytesForKey:name returnedLength:&sizep];memcpy(data, _data, sizep);}break;default:@throw[NSException exceptionWithName:@"编码异常" reason:[NSString stringWithFormat:@"有一个对象没有实例化,对象类型%s,所在类%@,变量名%@",typeEncode,NSStringFromClass(tempClass),name] userInfo:nil];break;}}// NSLog(@"ivar name = %s type = %s",ivar_getName(ivars[i]),ivar_getTypeEncoding(ivars[i]));}tempClass = [tempClass superclass];free(ivars);//释放ivarlist}}return self;}[/cpp]编码实现[cpp]-(void)encodeWithCoder:(NSCoder *)aCoder{id tempClass = [self class];while (tempClass != [NSObject class]) {unsigned int outCount;Ivar * ivars = class_copyIvarList(tempClass, &outCount);#undef NSLogfor (int i = 0; i < outCount; i++) {const char * typeEncode = ivar_getTypeEncoding(ivars[i]); //变量类型void * data = (char *)self + ivar_getOffset(ivars[i]); //变量地址NSString * name = [NSString stringWithUTF8String:ivar_getName(ivars[i])];//变量名字 keyif ([self isSaveToDriver:name]) {switch (typeEncode[0]) {case ‘i’:case ‘I’://整型跟无符号整型[aCoder encodeInt:*(int *)data forKey:name];break;case ‘B’:NSLog(@"%x",(int)data);[aCoder encodeBool:*(BOOL *)data forKey:name];break;case ‘c’://字符型[aCoder encodeBytes:data length:1 forKey:name];break;case ‘f’://float[aCoder encodeFloat:*(float *)data forKey:name];break;case ‘d’://double[aCoder encodeDouble:*(double *)data forKey:name];break;case ‘@’://object[aCoder encodeObject:*(NSObject **)data forKey:name];break;case ‘{‘://结构体{NSUInteger sizep = 0;NSUInteger alignment = 0;NSGetSizeAndAlignment(typeEncode, &sizep, &alignment);[aCoder encodeBytes:data length:sizep forKey:name];}break;default:{@throw[NSException exceptionWithName:@"编码异常" reason:[NSString stringWithFormat:@"有一个对象没有编码,对象类型%s,所在类%@,变量名%@",typeEncode,NSStringFromClass(tempClass),name] userInfo:nil];}break;}}}tempClass = [tempClass superclass];free(ivars);}}

 

把这两个函数复制到根类即可实现自动序列化

 

源博客地址,http://onlywish.me

转载于:https://www.cnblogs.com/onlywish/p/4189015.html

你可能感兴趣的文章
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
autoconf,automake,libtool
查看>>
jQuery的技巧01
查看>>
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>