C ++(半)文件保存/加载的反射? (破解版?)

时间:2011-01-11 07:06:46

标签: c++ serialization

我在C ++中有一堆结构。我想将它保存到文件并再次加载它们。问题是我的一些结构是基类(/结构)的指针。所以我需要一种方法来找出类型并创建它。它们真的只是POD,它们都有公共成员而没有构造函数。

从文件中保存和加载它们的最简单方法是什么?我有很多结构,我使用的唯一类型是整数,指针或c字符串。我想我可以做一些宏观黑客攻击。但我真的不知道该怎么做。

3 个答案:

答案 0 :(得分:4)

您是否尝试过Boost serialization库?

答案 1 :(得分:2)

不要在这里自己动手 - 使用经过深思熟虑和测试的东西。一个想法是Protocol Buffers

答案 2 :(得分:0)

指针提出了一个特定问题:我认为多个struct实际上可能引用相同的指针,并且你希望在反序列化时重新创建一个指针...

避免样板代码的第一个想法是创建一个编译时反射工具:

这两个宏会在你的struct上生成一些邪恶的信息,这样你就可以将它们与Fusion算法一起使用,这些算法跨越了编译时和运行时之间的差距。

现在,您需要一些能够序列化和反序列化数据的东西。反序列化通常有点困难,尽管在这里你没有多态性的优势(这总是让事情变得困难)。

通常,在第一遍中,您标识要序列化的对象的图形,为它们分配所有ID,并在序列化时使用此ID代替指针。对于反序列化,使用3列映射:

  • 地图是ID - > (指向已分配对象的指针,无法设置的指针列表)
  • 分配所有对象,每次用指向所分配对象的指针填充ID映射
  • 当您需要反序列化ID时,请在地图中查找,如果没有,请在相应列表中添加指针
  • 当您将指针放到地图中的已分配对象时,请花时间填充所有“未设置”指针(并同时删除列表)

当然,最好让框架为您处理它。您可以尝试s11n,如果我没记错,它会处理引用的循环。