boost::Serialize VS std::fstream

boost::Serialize VS std::fstream

本文关键字:fstream std Serialize boost VS      更新时间:2023-10-16

嘿,我想我对boost::serialize:

的目的有点困惑

必须为你计划保存的每个类添加boost::serialize函数似乎有点违背了库的目的,因为比起提高/减少开发时间,它似乎会增加大量的时间,因为你必须进入并编辑你使用的每个库中的每个类的源代码,所以它有一个序列化函数

我计划使用它的SFML/Box2D游戏,但现在我有第二个想法,一旦我认为这通过....我使用图书馆错误吗?

似乎std::fstream将是一个更好的主意,因为它不需要对任何想要保存的类进行任何函数或更改,并且我可以设计一个"保存类"。

呃,什么?提振。序列化不能替代I/O流。它是一个序列化框架(即从外部存储保存和恢复对象的状态),归档仍然包装某种流来实际读取和写入数据。当然,你需要编写序列化函数,库没有办法知道数据在哪里,或者它应该如何在存档中布局——如果你使用fstream,不管这在这种情况下意味着什么,你仍然必须做同样的事情。您也不一定需要将save/load函数实现为类成员——文档说明了如何使它们成为自由函数。

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

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

看起来std::fstream会是一个更好的主意,因为它不需要对你想要保存的任何类进行任何函数或更改,我可以设计一个"保存类"。

一个更好的主意去做什么?

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

如果你可以整理所有你想保存到一个"保存类"的信息,那么你就不需要序列化

同样,你不能只把类写进流;您必须实现operator<<重载或其他函数来保存其数据并将其加载回来。是的,你可以用memcpy把物体的碎片扔出去,但这并不完全安全。所谓"不完全安全",我的意思是"除非你真的,真的知道你在做什么,否则你永远不应该这样做。"