我正在编写一个简单的二进制序列化器来生成针对Windows,Mac和Linux 64位平台的64位video游戏的保存文件。 select用于序列化的variablestypes是:char,short,bool,unsigned int,int,float,可能是double,也可能是long int。 我正在编译Visual Studio。 序列化尽可能简单,没有检查,只需简单地写入二进制数据,然后以相同的顺序对数据进行反序列化即可。 游戏在整个游戏过程中非常频繁地将新的数据保存到文件中,但是在游戏之前数据仅被反序列化一次。
我不认为可移植性是我需要担心的一个简单的保存游戏function。 然而,我一直在阅读与二进制序列化相关的许多可移植性问题(例如浮点表示,位宽,字节顺序,alignment方式等的变化),而且我还不能确定这个主题是否确定这些可移植性问题不会在这个项目中占据头把交椅。 也许有人会好好分享一些对以下假设的看法:
是否有可能在一台机器上保存并在另一台机器上加载会在任何这些情况下破坏数据?
提前谢谢了。
如果使用诸如::std::uint32_t
类的大小整数类型而不是诸如unsigned long
类的难以理解的类型,那么在32位/ 64位平台和不同编译器之间可能会发生的整数大小变化将大大节省。 技术上整数位的宽度可能会有所不同,但只有在相当异乎寻常的平台上,绝对不能被认为适合游戏。 浮点大小和表示也不应该担心。
为了确保读取/写入的数据结构的大小和对齐性在各个平台之间保持一致,您应该在代码中使用static_assert
。
但是,如果要保存文件是可移植的,则检查字节序是必需的。 通常情况下,您可能希望使用本机排序序列化数据,并在文件开始处写入一些指示其字节顺序的幻数(如0x01020304
)。 然后,当你反序列化你第一次检查这个魔法,并选择本地排序解串器(这是更快)或翻转序列化(这是较慢)。