在实现video游戏的基本二进制序列化时,可移植性是否需要担心?

我正在编写一个简单的二进制序列化器来生成针对Windows,Mac和Linux 64位平台的64位video游戏的保存文件。 select用于序列​​化的variablestypes是:char,short,bool,unsigned int,int,float,可能是double,也可能是long int。 我正在编译Visual Studio。 序列化尽可能简单,没有检查,只需简单地写入二进制数据,然后以相同的顺序对数据进行反序列化即可。 游戏在整个游戏过程中非常频繁地将新的数据保存到文件中,但是在游戏之前数据仅被反序列化一次。

我不认为可移植性是我需要担心的一个简单的保存游戏function。 然而,我一直在阅读与二进制序列化相关的许多可移植性问题(例如浮点表示,位宽,字节顺序,alignment方式等的变化),而且我还不能确定这个主题是否确定这些可移植性问题不会在这个项目中占据头把交椅。 也许有人会好好分享一些对以下假设的看法:

  1. variables可以在一台机器上被序列化为一个二进制文件,然后二进制文件可以被复制,并在具有相同操作系统和x86-64 CPU的不同机器上安全地反序列化。
  2. 如果我假设运行游戏的所有机器都是运行64位操作系统的小端x86-64风格的CPU,那么我能否假定二进制文件在操作系统之间也可以完全移植?
  3. 如果我要扩大开发以支持游戏的32位版本(仍然假定目标平台上是x86-64 CPU架构,但是32位操作系统),并且32位操作系统最终用户决定升级到64位操作系统,安装游戏的64位版本,然后加载他们的旧的保存文件,在运行32位版本的游戏的32位操作系统上序列化 – 可以安全地反序列化这些variablestypes64位平台的序列化顺序没有任何检查或testing的兼容性?

是否有可能在一台机器上保存并在另一台机器上加载会在任何这些情况下破坏数据?

提前谢谢了。

如果使用诸如::std::uint32_t类的大小整数类型而不是诸如unsigned long类的难以理解的类型,那么在32位/ 64位平台和不同编译器之间可能会发生的整数大小变化将大大节省。 技术上整数位的宽度可能会有所不同,但只有在相当异乎寻常的平台上,绝对不能被认为适合游戏。 浮点大小和表示也不应该担心。

为了确保读取/写入的数据结构的大小和对齐性在各个平台之间保持一致,您应该在代码中使用static_assert

但是,如果要保存文件是可移植的,则检查字节序是必需的。 通常情况下,您可能希望使用本机排序序列化数据,并在文件开始处写入一些指示其字节顺序的幻数(如0x01020304 )。 然后,当你反序列化你第一次检查这个魔法,并选择本地排序解串器(这是更快)或翻转序列化(这是较慢)。