序列化包含 std::string 的类:理解指针困境
序列化是用于保存对象状态的关键技术用于存储或转移。然而,由于 std::strings 的指针性质,序列化包含 std::strings 的类会带来挑战。
尝试通过将包含 std::string 的类转换为 char 来序列化包含 std::string 的类时会出现此问题* 并将其写入文件。此方法适用于简单数据类型,但不适用于 std::strings,因为它不考虑指针依赖性。
指针序列化的标准解决方法
要克服对于这个问题,标准的解决方法包括将序列化和反序列化方法引入到类中。这些方法手动处理对象内部数据(包括指针)的写入和读取。
示例实现如下:
// Serialization method std::ostream& MyClass::serialize(std::ostream &out) const { // Serialize numeric values using the output stream out << height; out << ',' // Separator out << width; out << ',' // Separator // Serialize the std::string out << name.size(); // String length out << ',' // Separator out << name; // String characters return out; } // Deserialization method std::istream& MyClass::deserialize(std::istream &in) { if (in) { // Deserialize numeric values using the input stream int len=0; char comma; in >> height; in >> comma; // Separator in >> width; in >> comma; // Separator // Deserialize the std::string in >> len; // String length in >> comma; // Separator if (in && len) { std::vector<char> tmp(len); in.read(tmp.data() , len); // String characters 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;}
通过使用这些技术,std::strings 可以作为更大类的一部分进行有效的序列化和反序列化,保留它们的完整性和指针依赖性。
以上是如何在 C 中正确序列化包含 std::string 的类?的详细内容。更多信息请关注PHP中文网其他相关文章!