在C中自己实现反射与序列化.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在C中自己实现反射与序列化

在C++中自己实现反射与序列化 卓越 stjzhuo 反射能做什么? 获取对象的类型 动态类型转换 获取类型名字 获取枚举名 提供索引到类型的方法 通过名字 父类、子类 指针及const类型的转换 获取对象成员的列表及信息 获得成员的名字、大小、类型、访问域 通过名字索引到成员 动态地获取和设置成员的值 获取对象方法的列表及信息 获得方法的名字、返回值、参数类型、访问域 通过名字索引到方法 动态地调用方法 动态创建和销毁对象 动态地构成类型 Attribute / Tag 反射能带来什么好处? 为语言带来更多的动态特性 序列化支持 方便编辑工具的开发 如何在C++中使用反射? 第三方库 cpgf library Mirror C++ QT also has reflection support ... ... DIY! 思路 预编译器 QT的思路 不需要手动进行反射定义 编译期就能确定 实现比较麻烦 直接在代码中定义 AGE、cpgf的思路 需要手动进行反射定义,使用比较麻烦 可以用宏和模板来简化 实现比较简单 *二者根本上来说没啥区别 反射定义例子 反射使用例子 MetaInfo的声明 MetaInfo的定义(初始化) 关键点: 所有MetaInfo的初始化必须在任何使用发生之前 一个类型的MetaInfo的初始化必须在其父类以及其属性、方法所引用到的类型的MetaInfo初始化之后(依赖性) 思路: 针对关键点1,可以使用static变量或是方法的形式 C++对所有静态变量的初始化顺序是不确定的,无法满足依赖性的需求,因而采用static方法,手动确定调用顺序 每个MetaInfo应该只被初始化一次 MetaInfo的定义(初始化) Property的反射 * Property对应于C++中的成员变量 / C#中的Field 容器型Property的反射 容器型Property的反射 枚举型Property的反射 MetaInfo中存在相应的字段用于储存枚举名和对应的值 添加枚举类型Property的方法和其他普通Property无异 Method的反射 支持方法名、返回类型、参数名和类型的反射,同时提供统一的接口以调用所有反射的方法 序列化能带来什么好处? 方便地保存和读取对象(从文件流或是内存流) 关卡文件 游戏存档 Prefab 配置信息 简单地实现对象复制 对象A = 序列化 = 数据 = 反序列化 = 对象B Undo / Redo也可以这么做! 序列化使用例子 SerializableObject 序列化的基本单位 拥有name和guid PreSave回调可以做序列化前的准备工作,以及把关联的其他对象加入Package PostLoad回调可以做载入后的初始化工作 MetaInfo对序列化的支持 每个类型都可以自定义Save / Load方法 将对象转换成字符串/二进制数据 从字符串/二进制数据读取到对象 复杂类型可自定义Serialize / Deserialize方法 自定义子对象的序列化方式 灵活性高 每个类型的Create / Destroy方法也被记录在MetaInfo中 GUID的作用 用于保存和恢复指针引用的关系 一个GUID对应一个SerializableObject 序列化时 引用到的其他对象在PreSave时添加到Package中 指针引用只保存引用对象的GUID 反序列化时 建立引用位置到GUID的映射 建立GUID到对象的映射 所有对象都创建后,根据以上两重映射关系重建指针引用 映射失败的指针置为NULL 谢谢 * 声明MetaInfo 声明方法 ↑ 头文件中 ↓ CPP文件中 定义MetaInfo 定义属性 定义方法 MetaInfoManager MetaInfo MetaInfo MetaInfo Property Property Method Method Object 所有希望反射的非简单类型都需要进行MetaInfo的声明 同时必须保留默认构造函数作为动态创建对象的方法 不论怎样获取MetaInfo,最终都会通过这个方法 * END_METAINFO中会顺便对Class*及const Class*的MetaInfo进行初始化,并建立关联 对应不同情况 保证MetaInfo只被初始化一次 这里产生了递归调用,也就保证了依赖性 通过NULL指针对象来计算成员变量的内存偏移量 也有Begin/End的形式,可以设置Property的Tag信息(最大最小值等),以及DisplayName 提供对STL常用容器的支持 Property的metaInfo指向容器元素的类型 * 对应map有secondaryMetaInfo 所有容器的操作都是通过ElementGetterF

您可能关注的文档

文档评论(0)

sunshaoying + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档