C++ 使用类型双关的POD结构序列化

C++ 使用类型双关的POD结构序列化,c++,serialization,struct,casting,type-punning,C++,Serialization,Struct,Casting,Type Punning,我想找出一种将POD结构序列化为字节向量的方法。我的应用程序是序列化游戏中的一些游戏状态对象,以便将它们保存到文件中,并在某个时候使用反向过程再次检索它们 我正在使用#pragma pack(1)强制对齐到1字节 要进行序列化,我只需将整个结构强制转换为void*,然后转换为unsigned char*,然后使用生成的指针使用make_unique初始化向量 我对C++比较陌生,我想知道做这些事情是否安全。以下是我最迫切的几个问题: 结构内存布局有保证吗 如果我强制打包到最接近的字节,是否保证结

我想找出一种将POD结构序列化为字节向量的方法。我的应用程序是序列化游戏中的一些游戏状态对象,以便将它们保存到文件中,并在某个时候使用反向过程再次检索它们

我正在使用
#pragma pack(1)
强制对齐到1字节

要进行序列化,我只需将整个结构强制转换为
void*
,然后转换为
unsigned char*
,然后使用生成的指针使用
make_unique
初始化向量

我对C++比较陌生,我想知道做这些事情是否安全。以下是我最迫切的几个问题:

  • 结构内存布局有保证吗
  • 如果我强制打包到最接近的字节,是否保证结构大小
  • 当更复杂的数据在结构内部时,例如向量或另一个结构,我该如何处理?我想在这种情况下我需要做一些递归序列化
  • 有什么巧妙的预处理器技巧可以帮助我轻松地翻转endianness吗
  • 朝相反的方向走是否安全;通过将
    无符号字符[]
    强制转换回结构类型进行反序列化 下面的代码就是我所说的一个例子。跑进来

    #包括
    #包括
    #包括
    #布拉格语包(1)
    结构体{
    无符号字符a;
    无符号整数b;
    无符号整数c;
    std::unique_ptr serialise()常量;
    };
    #pragma pack()
    std::unique_ptr PODStruct::serialise()常量{
    auto rawChar=(无符号字符*)((无效*)此字符);
    auto-serDataPtr=std::make_unique(rawChar,rawChar+sizeof(PODStruct));
    返回serDataPtr;
    }
    int main(){
    PODStruct foo={0x38,0x34353637,0x30313233};
    自动条=foo.serialise();
    用于(自动字节:*条){
    
    std::cout我会使用类似于boost序列化的东西。如果在同一台机器上使用,这将起作用。填充和对齐可能因不同的体系结构/编译器/版本而有所不同,并造成这种中断。与Reddit的评论相同:为什么你的
    序列化
    没有返回
    std::vector
    ?我会使用类似于boost serialization的东西n、 如果在同一台机器上使用,这将起作用。填充和对齐可能因不同的体系结构/编译器/版本而不同,并造成此中断。与Reddit上的注释相同:为什么您的
    序列化
    不返回
    std::vector