你能用memcpy反序列化字节吗?

时间:2018-04-23 21:14:32

标签: c++ memcpy

如果我有一个包含原语的类,例如一堆int或chars,是否可以使用memcpy进行反序列化和序列化?

MyClass toSerialize;
unsigned char byteDump[sizeof(toSerialize)];
memcpy(&byteDump, &toSerialize, sizeof(toSerialize));
WriteToFile(byteDump);

然后在另一个程序或计算机上执行此操作:

MyClass toDeserialize;
unsigned char byteDump[sizeof(toSerialize)];
LoadFile(byteDump);
memcpy(&toDeserialize, &byteDump, sizeof(byteDump));

我有这种情况,实际上这在同一个程序中有效。但是,如果我尝试在其他程序或PC上运行它,它有时不起作用,MyClass将具有不同的值。这样做是否安全?

2 个答案:

答案 0 :(得分:3)

  

这样做是否安全?

在不同的程序或平台之间,memcpy 不安全。您无法确保类型的字节布局是一致的。

在同一平台上的同一个程序中,只有当 T为{{1}时,才能使用memcpy 序列化格式正确的* is_trivially_copyable_v<T>类型true }}

std::atomic是一种利用某些类型的字节可复制的类型。

*类型T被视为&#34;格式良好&#34;如果定义的或默认的构造函数,赋值运算符或析构函数中没有错误。

答案 1 :(得分:1)

简而言之,没有。 memcpy()不是为此而设计的。话虽如此,如果您不关心数据和可执行文件的跨平台问题,您可以侥幸成功。

只要数据被一致地存储和检索,memcpy()就不会关心。