gpt4 book ai didi

c++ - 在 C++ 中反序列化对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:31:55 24 4
gpt4 key购买 nike

我知道如何通过以下方式序列化一个对象:

void encodeMsg(char **msg, const ConnectionParams& params)
{
std::ostringstream oss;
if (!(oss << params))
{
//failure
}
msg = oss.str();
}

如何将消息反序列化回对象?

意思是我想要这个方法:

ConnectionParams encodeMsg(char *msg)
{ ... }

所以我没有 instringstream 对象...我该怎么做?

最佳答案

类似于:

ConnectionParams decodeMsg(char *msg)
{
ConnectionParams ret;
std::istringstream iss(msg);
iss >> ret;
return ret;
}

假设这个类可以用 operator<< 序列化。 ,并提供对称相反的操作operator>> .在不知道其内部结构的情况下,无法序列化任意 C++ 对象,并且在这个答案中,我假设这些操作已经由类提供者实现。

此外,请注意,您可能应该传递 ConnectionParams 作为引用,例如:

void encodeMsg(char *msg, ConnectionParams& ret);

此外,您的 encodeMsg 是错误的,更有可能作为:

void encodeMsg(char **msg, const ConnectionParams& params)
{
....
*msg = oss.str();
}

即使这样也是错误的,因为oss.str()返回的是oss的一个内部指针,你不能把它返回给调用者,因为oss会在函数返回时被销毁,指针将失效。你最好返回一个 std::string 或类似的东西。

编辑:如果类不提供序列化和反序列化自身的方法怎么办?在足够简单的类上,不保存在堆上分配的指针,也不保存文件描述符,也不在构造函数和析构函数上有奇特的行为,你可以用与旧 C 结构相同的方式来做:解释它的所有字节作为缓冲区。请注意,这是危险的,类型不安全,并且缓冲区可能无法在不同的编译器/架构之间互操作。

// DISCLAIMER: Untested code!

class A {
int plain_variable;
char palin_array[50];
};
// Class A is ok to serialize this way

class B {
A plain_object_array[10];
double another_plain_variable;
};
// Class B is ok to serialize this way

class C {
float plain_object;
std::string fancy_string;
};
// Class C is *NOT* ok to serialize this way, because it contains an string,
// which, in turn, contains a heap allocated pointer

template<class T>
void serialize(const T& obj, std::string& buff)
{
const char *accessor = (const char *)&obj;
std::string tmp(accessor, sizeof(obj));
std::swap(buff, tmp);
}

template<class T>
void deserialize(const std::string& buff, T& obj)
{
char *accessor = (char *)&obj;
std::copy(buff.begin(), buff.end(), accessor);
}

看,这个方案的工作条件是你不太可能将它与第三方提供的类一起使用。最后,您可能需要存储自己重建对象所需的所有数据,并处理这些数据。

关于c++ - 在 C++ 中反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com