我在基于组件的游戏引擎中实现序列化,以便在我的游戏中保存和加载。我正在使用Cereal来帮助我进行序列化。但是,有两件事我不清楚:
我有很多组件,这些组件也包含类等。我是否需要为所有组件编写序列化函数?这意味着我必须编写大约100个序列化函数。它们中的大多数都是相同的(只是序列化所有成员变量)。有没有办法减少工作量?
如果我想序列化包含来自其他代码库的类的类,该怎么办?例如,我使用SDL和TinyXml。这是否意味着我必须在这些代码库中编写序列化函数?
我希望我可以阻止添加所有序列化函数的繁琐工作。
答案 0 :(得分:2)
不幸的是没有魔法。无论您使用哪种序列化库,无论是boost::serialization,s11n还是MFC,问题在于您始终必须为每个单独的类声明如何序列化自身。
这是因为类的成员没有可用的元数据,这可以允许在其成员类型的基础上自动化复杂类的序列化。
解决此问题的唯一方法是采用专门设计的类来解决动态自引用问题。但这可能会在性能方面付出代价,或者在构造方面产生开销而不是归档。 Arpproaches可以是:
的组合map
或属性容器,而不是本地硬编码变量。 另一种方法是设计一个可以在你的标题上运行的代码生成器,并在机械上生成selialization代码。但这本身就是一个雄心勃勃的项目。
最后一个想法:所有这些手动归档代码肯定是一个开销。但是,它允许您处理对象结构的进化,例如,如果较新版本的代码添加或删除某些成员,并且必须反序列化使用旧版本编写的文件。这是用自动化方法无法轻易实现的。