boost :: Serialize VS std :: fstream

时间:2011-07-31 21:41:15

标签: c++ serialization boost save fstream

嘿所以我想我对boost :: serialize:

的目的有点困惑

必须为你计划保存的每个类添加一个boost :: serialize函数似乎有点挫败了库的目的,而不是提升 /减少开发时间似乎它会添加大量的时间,因为您必须进入并编辑您使用的每个库中每个类的源,因此它具有序列化功能。

我打算将它用于SFML / Box2D游戏,但是现在我想到这一点后我还有第二个想法.... 我使用的库错了吗? < / p>

看起来std :: fstream会是一个更好的主意,因为它不需要任何功能或更改你要保存的任何类,我可以设计一个“保存课程。”

3 个答案:

答案 0 :(得分:6)

呃,什么? Boost.Serialization不是I / O流的替代品。它是序列化的框架(即从外部存储器保存和恢复对象的状态),归档仍然包装某种流以实际读取和写入数据。当然你需要编写序列化函数,库无法知道数据的位置,或者如何在存档中放置 - 如果你使用fstream,无论在这种情况下是什么意思,你还是要做同样的事。您不一定需要将保存/加载函数实现为类成员 - 文档说明如何将它们作为自由函数。

答案 1 :(得分:2)

直接写入标准流仍然需要编写序列化/反序列化函数对。不仅标准库的iostream组件不支持自定义类的I / O,而只是写入和读回sizeof(yourObject)字节是行不通的。想想如果你的类包含指针成员会发生什么。

此外,序列化库提供了支持不同格式和版本控制等功能,这可能很有用。

答案 2 :(得分:0)

  

似乎std :: fstream会是一个更好的主意,因为它不需要对你要保存的任何类进行任何功能或更改,我可以设计一个“保存类”。

做什么更好的主意?

序列化通常用于保存和恢复对象的状态,而不是任意数据。它的目的是能够获取一袋对象并生成一个文件,以便以后可以从该文件中自动重建这些对象。

如果您可以将要保存的所有信息整理为“保存类”,则不需要 序列化。

此外,您不能只是将一个类写入流;您必须实现operator<<重载或其他一些功能来保存其数据并加载回来。是的,您可以使用memcpy抛出对象的位,但这并不完全安全。而且“不完全安全”,我的意思是“你不应该这样做,除非你真的,真的知道你在做什么。”