基于组件的游戏引擎中的序列化

时间:2015-02-27 14:10:40

标签: c++ serialization components game-engine

我在基于组件的游戏引擎中实现序列化,以便在我的游戏中保存和加载。我正在使用Cereal来帮助我进行序列化。但是,有两件事我不清楚:

  • 我有很多组件,这些组件也包含类等。我是否需要为所有组件编写序列化函数?这意味着我必须编写大约100个序列化函数。它们中的大多数都是相同的(只是序列化所有成员变量)。有没有办法减少工作量?

  • 如果我想序列化包含来自其他代码库的类的类,该怎么办?例如,我使用SDL和TinyXml。这是否意味着我必须在这些代码库中编写序列化函数?

我希望我可以阻止添加所有序列化函数的繁琐工作。

1 个答案:

答案 0 :(得分:2)

不幸的是没有魔法。无论您使用哪种序列化库,无论是boost::serializations11n还是MFC,问题在于您始终必须为每个单独的类声明如何序列化自身。

这是因为类的成员没有可用的元数据,这可以允许在其成员类型的基础上自动化复杂类的序列化。

解决此问题的唯一方法是采用专门设计的类来解决动态自引用问题。但这可能会在性能方面付出代价,或者在构造方面产生开销而不是归档。 Arpproaches可以是:

的组合
  • 归档感知基类。
  • map或属性容器,而不是本地硬编码变量。
  • 最终为每个可序列化成员使用自存档基类型,并且在构造对象时将它们注册在一种存档工作列表中。

另一种方法是设计一个可以在你的标题上运行的代码生成器,并在机械上生成selialization代码。但这本身就是一个雄心勃勃的项目。

最后一个想法:所有这些手动归档代码肯定是一个开销。但是,它允许您处理对象结构的进化,例如,如果较新版本的代码添加或删除某些成员,并且必须反序列化使用旧版本编写的文件。这是用自动化方法无法轻易实现的。