2011-10-25 34 views
2

我有一些序列化逻辑,我也序列化stl数据结构。目前我只是通过遍历它来编写大小字段,然后写入结构的每个元素。在反序列化中,我读取size字段,然后知道何时完成读取数据结构。是迭代器:: difference_types系统独立

没有问题是如何正确编写大小字段和系统独立。目前我使用std::iterator_traits<const_iterator>::difference_type作为存储在文件中的类型。但是我不确定,如果这种类型保证独立于系统,或者可能会改变,当我尝试在不同系统之间交换文件时。

我看过std::string这种类型,在这种情况下,sizeof(std::iterator_traits<std::string::const_iterator>::difference_type)在64位机器上返回8。所以我想在这种情况下,这只是一个size_t的typedef,它占用了一个字。我目前没有可用的32位机器,因此我无法检查其大小是否与此不同。

这是由标准保证是可移植的,还是我应该使用一些固定类型的所有数据结构来编码长度?

回答

2

这是由标准保证是便携式,还是我应该使用一些固定类型的所有数据结构来编码长度?

不,它不可移植,是的,你应该使用一些固定大小的类型。对于大多数应用程序,一个32位整数应该没问题。请注意,根据您的序列化代码和可移植性要求,您还可能面对字节顺序问题(小端和大端)。

有关更多信息和最佳做法,请参阅Qt QDataStream的文档。 Qt的人建议决定一个固定大小的整数类型(如qint32),然后在序列化时适当地转换。

+0

好吧,我会在这里使用一个固定大小的类型,以确保它可以跨平台使用。我已经考虑了字节顺序问题,所以我将在这里使用一个小的无符号整数类型。所有其他类型完全符合签名和大小,所以这不会是一个问题。 – LiKao

3

所有这些类型定义的全部意义在于你做了而不是需要全局修复类型!

对于序列化,您必须决定并修复您的序列化格式。在这一点上,你可能只是要求大小适合一个32位整数,测试给定的大小是否和转换。如果出现错误,可以让序列化失败(例如“数据结构不可序列化”)。如果您认为有必要,请将尺寸字段设置为64位,并且您应该有足够的余地,但是您需要权衡空间与灵活性和使用情况。你真的会拥有超过40亿个元素的容器并将它们写入磁盘吗?

序列化是关于制定决策和发布处方,你必须忍受并考虑到导入和导出失败的可能性。

2

difference_type由标准定义为一个“符号整数类型”(20.1.5,表32)和需要为ptrdiff_t类型(20.1.5/4),而这又是一个typedef实现定义(5.7/6)。

由于这里的共同点是它可以转换为“有符号整数类型”,所以如果你需要序列化这个值,我建议static_cast把它看作long之类的东西并保存。