HandyJSON代码阅读
功能:model = modelType.transform(rawdata)
使用分析:
使用机制:继承+实现配置+使用;
需要自己实现什么?
设计分析:
工具模块?机制模块?model基类?
生成机制?
如何组织?
接口:通过继承使用接口;
主干类:
JSONDeserializer<T: HandyJSON>
HandyJSON: _ExtendCustomModelType: _Transformable: _Measurable
_ExtendCustomModelType
mutating func mapping(mapper: HelpingMapper)
mutating func didFinishMapping()
_Transformable
transform(from object: Any) -> Self?
_Measurable
headPointerOfStruct() -> UnsafeMutablePointer<Byte>
问题分解:
1、遍历rawdata对model赋值;
2、赋值解决方案,前提条件:无法获取成员变量的内存引用;
解决方案:kvc赋值(不支持)、根据内存对齐规则直接对内存赋值;
3、对象内存模型信息提取;
4、复杂赋值要处理的情况:
(1)rawdata引用与目标变量名称不一致;
(2)rawdata引用与目标变量路径不一致;
(3)rawdata引用与目标变量类型不一致;
static func _transform(dict: [String: Any], to instance: inout Self) {
guard let properties = getProperties(forType: Self.self) else {
InternalLogger.logDebug("Failed when try to get properties from type: \(type(of: Self.self))")
return
}
// do user-specified mapping first
let mapper = HelpingMapper()
instance.mapping(mapper: mapper)
// get head addr
let rawPointer = instance.headPointer()
InternalLogger.logVerbose("instance start at: ", Int(bitPattern: rawPointer))
// process dictionary
let _dict = convertKeyIfNeeded(dict: dict)
let instanceIsNsObject = instance.isNSObjectType()
let bridgedPropertyList = instance.getBridgedPropertyList()
for property in properties {
let isBridgedProperty = instanceIsNsObject && bridgedPropertyList.contains(property.key)
let propAddr = rawPointer.advanced(by: property.offset)
InternalLogger.logVerbose(property.key, "address at: ", Int(bitPattern: propAddr))
if mapper.propertyExcluded(key: Int(bitPattern: propAddr)) {
InternalLogger.logDebug("Exclude property: \(property.key)")
continue
}
let propertyDetail = PropertyInfo(key: property.key, type: property.type, address: propAddr, bridged: isBridgedProperty)
InternalLogger.logVerbose("field: ", property.key, " offset: ", property.offset, " isBridgeProperty: ", isBridgedProperty)
if let rawValue = getRawValueFrom(dict: _dict, property: propertyDetail, mapper: mapper) {
if let convertedValue = convertValue(rawValue: rawValue, property: propertyDetail, mapper: mapper) {
assignProperty(convertedValue: convertedValue, instance: instance, property: propertyDetail)
continue
}
}
InternalLogger.logDebug("Property: \(property.key) hasn't been written in")
}
}
HandyJSON代码阅读的更多相关文章
- 代码阅读分析工具Understand 2.0试用
Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...
- Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码
我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...
- Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- [置顶] Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...
- 图形化代码阅读工具——Scitools Understand
Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
- MediaInfo代码阅读
MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...
- Tools - 一些代码阅读的方法
1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
随机推荐
- touch-slide-image
用htmls5+css3实现的在android和ios,以及wekit新版浏览器上实现手指滑动切换图片. https://github.com/navyxie/touch-slide-image
- grunt-contrib-cssmin使用指南
原文:http://riny.net/2014/grunt-cssmin/ grunt-contrib-cssmin v0.7.0 使用cssmin压缩css文件 Getting Started 这个 ...
- [转]Supporting OData Query Options in ASP.NET Web API 2
本文转自:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/suppor ...
- [转]error MSB4018: The "GenerateResource" task failed unexpectedly
本文转自:https://github.com/Microsoft/msbuild/issues/364 After uninstall Visual Studio 2015 Update 1 RC ...
- 一个骚气的前端JS代码生成网站
生成Javascript 颜文字代码 稍微试了试 原本的代码: alert("Hello, JavaScript") 转换后代码 ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`* ...
- spring-boot配置log4j日志
spring boot默认使用logback日志记录工具,修改为log4j: <dependency> <groupId>org.springframework.boot< ...
- c语言printf实现同一位置打印输出
控制台同一位置打印输出,例如:进度1%->100%在同一位置显示.刚学习c语言的时候一直想做起来,可惜查询好多资料不行.时隔6年多,空闲之余又想起这个问题,便决定一试,虽然c语言已经几乎忘光了, ...
- struts2 执行流程及工作原理
在Struts2框架中的处理大概分为以下的步骤 1 用户发送请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过 ...
- 给div加上padding和border,如何不让div整体改变
最近要入门H5,遇到很多困惑,所以,每解决一个,我就要写在博客里,以防忘记! 给div加上padding和border,如何不让div整体改变? 如果想要实现这样的效果,只需要在这个div块中写入 b ...
- AngularJS实现原理
个人觉得,要很好的理解AngularJS的运行机制,才能尽可能避免掉到坑里面去.在这篇文章中,我将根据网上的资料和自己的理解对AngularJS的在启动后,每一步都做了些什么,做一个比较清楚详细的解析 ...