Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在为视频游戏实现基本二进制序列化时,可移植性是否值得担心?_C++_Linux_Windows_Serialization - Fatal编程技术网

C++ 在为视频游戏实现基本二进制序列化时,可移植性是否值得担心?

C++ 在为视频游戏实现基本二进制序列化时,可移植性是否值得担心?,c++,linux,windows,serialization,C++,Linux,Windows,Serialization,我正在编写一个简单的二进制序列化程序,为针对Windows、Mac和Linux 64位平台的64位视频游戏生成保存文件。为序列化选择的变量类型有:char、short、bool、unsigned int、int、float、double和long int。我正在Visual Studio上编译。序列化尽可能简单,不需要检查,只需简单地写入二进制数据,然后按相同顺序反序列化数据。在整个游戏过程中,游戏会频繁地将新数据保存到文件中,但数据仅在游戏开始前反序列化一次 我不认为便携性是我需要担心的一个简

我正在编写一个简单的二进制序列化程序,为针对Windows、Mac和Linux 64位平台的64位视频游戏生成保存文件。为序列化选择的变量类型有:char、short、bool、unsigned int、int、float、double和long int。我正在Visual Studio上编译。序列化尽可能简单,不需要检查,只需简单地写入二进制数据,然后按相同顺序反序列化数据。在整个游戏过程中,游戏会频繁地将新数据保存到文件中,但数据仅在游戏开始前反序列化一次

我不认为便携性是我需要担心的一个简单的保存游戏功能;然而,我一直在阅读与二进制序列化相关的许多可移植性问题(例如,浮点表示、int的位宽度变化、endianness、对齐等)我对我对这个主题的理解没有足够的信心来确定这些可移植性问题不会在这个项目中出现。也许有人愿意就以下假设分享一些观点:

  • 变量可以在一台机器上串行化为二进制,并且 然后,二进制文件可以被复制并安全地反序列化到 具有相同操作系统和x86-64 CPU的不同计算机
  • 如果我假设所有运行游戏的机器都是运行64位操作系统的little endian x86-64风格的CPU, 我是否可以假设二进制文件可以在 还有操作系统吗
  • 如果我要扩展开发以支持32位版本的游戏(仍然假设目标上有x86-64 CPU架构) 平台,但32位操作系统),32位操作系统最终用户决定 升级到64位操作系统,安装64位版本的游戏,然后 然后加载在32位上序列化的旧保存文件 运行32位版本游戏的操作系统可以使用这些变量类型 然后按照中的顺序在64位平台上安全地反序列化 它们在没有任何检查或测试的情况下被序列化 兼容性
  • 在任何一种情况下,在一台机器上保存和在另一台机器上加载都可能损坏数据吗


    非常感谢。

    如果您使用大小整数类型,如
    ::std::uint32\u t
    而不是模糊类型,如
    unsigned long
    ,那么您将可以避免在32位/64位平台和不同编译器之间可能出现的整数大小变化。整型比特宽度在技术上可能会有所不同,但只适用于那些显然不适合玩游戏的非常奇特的平台。浮点大小和表示形式也不应该引起关注

    为了确保读/写数据结构的大小和对齐在不同平台上保持一致,您应该在代码中使用
    static\u assert


    但是,如果希望保存的文件可移植,则必须检查endianness。通常,您可能希望使用本机endianness序列化数据,并在文件开头写入一些表示其endianness的幻数(如
    0x01020304
    )。然后,当您反序列化时,首先检查此魔术,然后选择本机endianness反序列化程序(速度更快)或翻转endianness反序列化程序(速度较慢)。

    如果您仅计划支持x86 Endians,则不必担心。整数大小的可变性可以通过
    cstdint
    中定义的固定宽度整数来解决。非常感谢,这接近我的计划。在反序列化过程中转换endian类型就像反转字节顺序一样简单;i、 我不需要担心重新排序单个位?是的,重新排序位是不必要的。