你能用内存反序列化字节吗?
Can you deserialize bytes with memcpy?
如果我有一个包含原语的类,例如一堆整数或字符,是否可以使用 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
是不安全的。 您不能保证类型的字节布局是一致的。
在同一平台上的同一程序中,仅当true
is_trivially_copyable_v<T>
时,才能使用memcpy
序列化格式正确的 * 类型T
。
std::atomic
是一种利用某些类型可按字节复制的类型。
*如果定义或默认的构造函数、赋值运算符或析构函数中没有错误,则类型T
被视为"格式良好"。
简而言之,没有。memcpy()
不是为此而设计的。 话虽如此,如果您不关心跨平台问题,无论是数据还是可执行文件,都可以侥幸逃脱。
只要数据存储和检索一致,memcpy()
就不会在乎。
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 在进程的内存中序列化/反序列化
- 谷物/C++ 11 - 如何指定反序列化的可选参数
- 你能用内存反序列化字节吗?
- 在 c++ 中使用 Json 序列化/反序列化字节数组
- 如何通过从文件中读取来反序列化C++的字节数组