关闭

C++的反射和序列化

标签: c++serializationinheritance引擎编译器
6385人阅读 评论(10) 收藏 举报
分类:

Gamasutra上有篇文章讲得挺细的: Sponsored Feature: Behind the Mirror - Adding Reflection to C++

  • RTTI
    • 在Class声明后加入RTTI宏的做法几乎快成各种引擎的标配了, 谁叫C++的rtti太弱来着.
    • 之前只是认为自己实现RTTI的原因是dynamic_cast的效率不高和对象工厂的需要, 原来关掉这个编译选项还可以减少占用的内存
  • Field(Property)
    • 实现反射必须有一些属性成员的描述类, 这些信息目前看到三种实现方法
      • 使用工具/编译器中间信息等根据C++代码解析生成(Havok冒似是这种实现). 不推荐, 见原文
      • 使用各种模板+宏像RTTI那样进行注册, 查询方便, 缺点是会增加启动时间和内存占用, 难于单步调试
      • 使用访问者模式, 在需要查询信息时才创建, 编码比较灵活, 但是访问起来比较慢
      • 一般都是记录成员变量相对于class/struct的offset和size, 再根据实例指针计算出内存地址
  • Method
    • 目前还没有看到把方法也做了反射的引擎, 到是cppreflect里有实现. 编码上越简洁越好, 复杂的可以使用脚本代替
  • Clone
    • 做了反射的另一个好处就是对象可以深度拷贝, 这也是Prefab/Template的基础要求
  • Serialization
    • 有了反射做序列化相当的方便, 如果没有的话就像GameBryo那样做也凑合
    • 把Name(或CRC)与Value一起序列化后就可以做到版本的兼容, 对于成员属性改动频繁的情况很实用
    • 对于重复性的数据的二进制序列化可以进行压缩, 如数组
    • 对于内存Buffer的XML序列化, 可以使用base64编码成字符串
  • Inheritance
    • 数据继承, 或者要数据拷贝, 就是对象实例之间的数据有继承关系, 只保存相对于父实例(Template)不同的数据
  • Others
    • 以前做Delegate实现的时候只接触过成员函数指针, 没想到还有个成员变量指针, C++真是博大精深
    • Enum和Container需要特殊对待
    • 如果要反射到.net的PropertyGrid, 可以使用ICustomTypeDescriptor构造动态属性对象, 或者使用Reflection.Emit动态编译生成类型
1
0
查看评论

C++实现反射(Reflection)

C++实现Reflection最近1年多,我一直在琢磨和大量使用cli来开发游戏项目,.net系统的反射系统给我的开发设计思路,带来了很大的冲击。反射真的可以从根本上,让设计思路相对传统开发模式有很大的改变。但是反射通常都提供在类似java等动态语言上,后来ms在.net平台上推出了一个很强大完善的...
  • johnson3d
  • johnson3d
  • 2008-03-28 10:31
  • 12411

C++ Reflection 实现

  • 2008-04-02 12:43
  • 6KB
  • 下载

C++反射机制的实现

Java中有天然的反射机制,因为Java本身就是半编译语言,很多东西可以在运行时来做,但是c++就不同了。要建立c++的反射机制,就需要登记每个类名与对象的对应关系。 1.前言 在实际的项目中,听到师兄说C++中用到了反射,出于好奇,就查阅相关资料,发现强大的C++本身并不支持反射,反而Java...
  • Scythe666
  • Scythe666
  • 2016-06-20 10:03
  • 8770

序列化和反序列化

序列化和反序列化 C# [Serializable] 与[Serializable()]   这两个是一样的  这个标签是类可以被序列化的特性,表示这个类可以被序列化。  什么叫序列化?  我们都知道对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质...
  • jsm8523
  • jsm8523
  • 2013-08-17 13:16
  • 306

C#笔记

--委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
  • jsm8523
  • jsm8523
  • 2013-08-06 14:43
  • 381

反射与序列化

  对于反射与序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.在此我简介一下反射与序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误的 所以 如果你对这两个概念还是模糊的话 建议还是查阅MSDN的解...
  • smallfishff
  • smallfishff
  • 2007-05-23 11:51
  • 4682

学习笔记 asp.net 08/12/13

相换工作的朋友可以试着做一下:1. CLR、CTS、CLS 分别是什么意思? 共公语言运行库,通用类型系统,公共语言规范2. 什么是基元类型? 由编译器直接支持的数据类型称为基元类型.3. 值类型和引用类型的区别是什么?为什么要设计值类型?值类型会被GC回收吗?值类型是否能在托管堆分配? 4. Eq...
  • teakingxinyig
  • teakingxinyig
  • 2008-12-11 00:01
  • 1909

java序列化和java反射机制认识

一、序列化是什么?    序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。     序列化分为两大部分:序列化和反序列化。      (1)序列化—将数据分解成字节流,以便存储在文件...
  • qq_24892029
  • qq_24892029
  • 2016-04-20 22:17
  • 1675

游戏引擎C++反射和序列化方案心得

凡是上了点规模的游戏引擎,都需要面对C++反射和序列化的问题。反射和序列化对游戏引擎非常重要,因为在游戏里,需要处理大量的数据和对象,数据驱动的编程模式是非常普遍的。比如对于World Editor,有了反射机制,就能很方便的建立起对象属性和编辑操作的映射(也可以手动hard code去把对象属性列...
  • viX0026
  • viX0026
  • 2017-01-12 19:25
  • 236

Java反射机制和对象序列化

参考:http://blog.sina.com.cn/s/blog_6f611c300101f7q4.html 反射机制:      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用...
  • u010963246
  • u010963246
  • 2015-06-26 12:08
  • 1540
    个人资料
    • 访问:1529195次
    • 积分:19073
    • 等级:
    • 排名:第549名
    • 原创:254篇
    • 转载:74篇
    • 译文:28篇
    • 评论:939条
    博客专栏
    文章存档
    最新评论