c++ - ECS序列化

标签 c++ serialization deserialization game-engine

我目前正在为游戏引擎开发 ECS 系统,偶然发现了序列化问题。 我在我的 ECS 实现中用于组件存储的数据结构是一个预构建组件池,这些组件是可回收的。因此,添加一个实体就像为预构建组件赋值一样简单。 该系统旨在利用组件标识符而不是类型,这就是问题所在。 在序列化和反序列化时,组件被视为 BaseComponent 指针。

组件结构层次结构

struct BaseComponent {}; // struct used as base to store components

template<typename T>
struct Component : public BaseComponent {
    static const uint_fast32_t ID; // identifier used by the rest of the system
}

struct SomeComponent : public Component<SomeComponent> {
    // component specific data
}

我想要序列化、反序列化并将数据分配给 SomeComponent 中的适当字段的是组件特定数据。

我有一个简单的解决方案,但在干净的代码方面却相当可疑。我找到的解决方案是将组件内存直接转储到文件中,然后通过字符缓冲区将其读入内存。然而,这不允许指针,在我看来,这是非常令人厌恶的。我发现的另一个解决方案是,如果可能的话,使用一个可变参数函数,该函数使用可变参数扩展构造一个具有聚合初始化的临时函数。但是这个方法并没有解决序列化和反序列化,只解决了赋值问题。

因此,我的问题是:是否有一种好的方法来序列化和反序列化多态类型,一般来说,当不知道类型信息时,如果没有,是否有更好的方法来做到这一点?

最佳答案

我会考虑 CRTP在这种情况下的模式。基类定义序列化/反序列化函数,这些函数调用交付类中的实际实现。维基百科文章有一些很好的例子。

关于c++ - ECS序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52925664/

相关文章:

java - JSON 使用 google-gson 序列化/反序列化通用类型

java - 使用 ObjectMapper 反序列化到参数化类时,甚至使用 TypeReference 和 TypeFactory 时出现 ClassCastException

c++ - 我可以在运行时初始化 static float 变量吗?

c++ - 如何跨共享对象管理 C++ 仅 header 库的编译

c++ - 我在练习 LeetCode 时遇到了一些奇怪的错误

c# - 在 XmlSerializer 上使用反序列化时始终为空

c# - 如何反序列化具有许多子节点的 XML

c++ - 为什么将枚举放在结构中然后使用 typedef 名称?

ios - 将 json 保存到 userDefaults 中

json - 如何将多个键值条目的 JSON 对象反序列化为 Rust 中的自定义结构