2

我正在使用 c++ 并且正在编写一个预算程序(我知道有很多程序可用——这只是一个学习项目)。

我想保存我称之为包含其他对象(例如“页面”)的书籍对象。页面还包含现金流和条目。问题是可以有任何数量的条目或现金流量。

我发现了很多关于将数据保存到文本文件的信息,但这不是我想要做的。

我已经尝试过使用 boost 库,因为有人告诉我序列化可能是解决这个问题的方法。我不完全确定 boost 的哪些功能会有所帮助,甚至不知道使用 boost 的正确方法是什么。

我见过的大多数二进制文件示例都是具有固定大小成员的对象。例如,一个点可能包含一个 x 值和一个 y 值,它们都是双精度值。情况总是如此,因此只需使用 sizeOf(Point) 就很简单。

所以,我要么在寻找这个问题的直接答案,要么在寻找有关如何解决我的问题的有用信息的链接。但请确保您的链接特定于该问题。

我也在cplusplus上发布了同样的问题

4

2 回答 2

3

一般来说,存储变长记录有两种方法:

  1. 首先存储大小整数,然后是数据。
  2. 存储数据,在末尾附加一个标记字符(或值)。

C 风格的字符串使用第二个选项。
对于选项一,数字包含数据的大小。

可选字段

如果您考虑为可选字段设计关系数据库,您将拥有一个包含已知或固定记录的表和另一个包含具有记录 ID 的选项字段的表。

更简单的方法可能是使用类似于 XML 的东西:字段标签。
将您的对象分成两部分:静态字段和可选字段。静态字段部分后跟一个可选字段部分。可选字段部分将包含字段名称,后跟字段数据。读入字段名称,然后读入值。

我建议您检查您的设计,看看是否可以消除可选字段。此外,对于复杂的字段,让他们读入自己的数据。

存储二进制数据

如果数据在平台之间共享,请考虑使用 ASCII 或文本表示。

阅读 Endianess 和位大小。例如,一个平台可以首先存储其二进制表示的最低有效字节并使用 32 位(4 个字节)。接收平台,64位,最高有效字节在前,直接读取数据会有问题,需要转换;因此失去了二进制存储的任何好处。

同样,浮点在二进制中也表现不佳。在浮点格式之间转换时也会损失精度。

在二进制中使用可选字段时,可以使用标记字节或数字作为字段 ID,而不是文本名称。

此外,文本格式的数据比二进制格式的数据更容易调试。

考虑使用数据库

请参阅在什么时候值得使用数据库?

于 2012-06-09T18:28:21.377 回答
0

文档在boost::serialization这里

boost::serialization处理用户编写的类以及 STL 容器:std::dequestd::list等。

于 2012-06-09T18:27:07.133 回答