你能用内存反序列化字节吗?

Can you deserialize bytes with memcpy?

本文关键字:字节 反序列化 内存      更新时间:2023-10-16

如果我有一个包含原语的类,例如一堆整数或字符,是否可以使用 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将具有不同的值。这样做安全与否?

这样做安全与否?

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

在同一平台上的同一程序中,仅当trueis_trivially_copyable_v<T>时,才能使用memcpy序列化格式正确的 * 类型T

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


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

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

只要数据存储和检索一致,memcpy()就不会在乎。