使用 reinterpret_cast 序列化和反序列化数据
serialize and deserialize datas with reinterpret_cast
>我尝试做一些简单的事情:我有 2 个函数,第一个生成 2 个 char 数组和 1 个 int 然后将它们连接起来,reinterpret_cast为void*
并返回它。
第二个将其reinterpret_cast为char*
并打印出来。问题是:如果我将其reinterpret_cast为char*
并在void*
转换后打印它(在同一函数中(,它运行良好,但在反序列化函数中则不然。
这是我的代码:
#include <sstream>
#include <unistd.h>
void * serialize( void )
{
char s1[9];
char s2[9];
int n;
std::string alphanum = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
s1[8] = ' ';
s2[8] = ' ';
for (int i = 0; i < 8; i++)
{
usleep(1);
s1[i] = alphanum[clock() % (alphanum.length() - 1)];
}
n = clock() % 2147483647;
for (int i = 0; i < 8; i++)
{
usleep(1);
s2[i] = alphanum[clock() % (alphanum.length() - 1)];
}
std::cout << "s1: " << s1 << std::endl;
std::cout << "n: " << n << std::endl;
std::cout << "s2: " << s2 << std::endl;
std::stringstream ss;
std::string str;
ss << s1 << n << s2;
ss >> str;
char * c = const_cast<char*>(str.c_str());
void * d = reinterpret_cast<void*>(c);
std::cout << reinterpret_cast<char*>(d) << std::endl; // HERE IT WORKS
return d;
}
void deserialize( void * raw )
{
char* c = reinterpret_cast<char*>(raw);
std::cout << c << std::endl; //HERE IT DOESN'T WORK
}
int main(void)
{
void* serialized = serialize();
deserialize(serialized);
return 0;
}
我的输出如下所示:
s1: 6dfhkmoq
n: 1857
s2: tyADFHKM
6dfhkmoq1857tyADFHKM
6�c2X� d2X�
我怎样才能拥有相同的输出?
那是因为您返回了一个指向string
对象内存的指针(具有自动存储(。从cppeference
返回值
指向基础字符存储的指针。
当堆栈展开时,为字符串分配的内存将被覆盖(其内部缓冲区也是如此(。当块由于异常或到达控制流的末尾而结束时,会发生这种情况。
阅读什么是堆栈展开?
为了确保您的内存位置仍然有效,您必须将其分配给堆。您可以创建一个shared_ptr并改为返回该。
然而,reinterpret_cast
通常闻起来像糟糕的设计,所以你可能想重新考虑为什么要把类型隐藏在void*
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 使用 QDataStream 对原始数据进行反序列化
- 使用 reinterpret_cast 序列化和反序列化数据
- static_assert 在使用 boost 反序列化二进制数据时失败"typex::value"失败
- Protofuf 反序列化消息没有数据
- Boost:重新使用/清除text_iarchive以从Asio:receive()中反序列化数据
- 反序列化构造函数无法正确读取数据
- 使用protobuf-net发布反序列化(protocolBuffer)序列化数据
- 增强序列化-在反序列化损坏数据时不再出现archive_exception
- 从数据库中序列化和反序列化数据的最快/最佳方式
- 从流或文件动态反序列化数据
- 不能在Java中反序列化来自c++的protobuf数据