gpt4 book ai didi

c++ - 序列化包含 std::string 的类

转载 作者:IT老高 更新时间:2023-10-28 21:42:23 33 4
gpt4 key购买 nike

我不是 C++ 专家,但我过去曾多次对事物进行序列化。不幸的是,这一次我试图序列化一个包含 std::string 的类,我理解这很像序列化指针。

我可以将类写出到文件中,然后再次读回。所有 int 字段都可以,但 std::string 字段给出“地址越界”错误,大概是因为它指向的数据不再存在。

对此有标准的解决方法吗?我不想回到 char 数组,但至少我知道它们在这种情况下工作。如有必要,我可以提供代码,但我希望我已经很好地解释了我的问题。

我通过将类转换为 char* 并使用 std::fstream 将其写入文件来进行序列化。阅读当然正好相反。

最佳答案

I'm serializing by casting the class to a char* and writing it to a file with fstream. Reading of course is just the reverse.

不幸的是,这仅在不涉及指针的情况下才有效。你可能想给你的类 void MyClass::serialize(std::ostream)void MyClass::deserialize(std::ifstream),然后调用它们。对于这种情况,您需要

std::ostream& MyClass::serialize(std::ostream &out) const {
out << height;
out << ',' //number seperator
out << width;
out << ',' //number seperator
out << name.size(); //serialize size of string
out << ',' //number seperator
out << name; //serialize characters of string
return out;
}
std::istream& MyClass::deserialize(std::istream &in) {
if (in) {
int len=0;
char comma;
in >> height;
in >> comma; //read in the seperator
in >> width;
in >> comma; //read in the seperator
in >> len; //deserialize size of string
in >> comma; //read in the seperator
if (in && len) {
std::vector<char> tmp(len);
in.read(tmp.data() , len); //deserialize characters of string
name.assign(tmp.data(), len);
}
}
return in;
}

您可能还希望重载流运算符以便于使用。

std::ostream &operator<<(std::ostream& out, const MyClass &obj)
{obj.serialize(out); return out;}
std::istream &operator>>(std::istream& in, MyClass &obj)
{obj.deserialize(in); return in;}

关于c++ - 序列化包含 std::string 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046244/

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