使用std::string 序列化一個類別
序列化包含std::string 的類別會因為字串的指標而面臨挑戰以自然為基礎。將類別轉換為 char* 並將其寫入檔案的標準技術將不起作用,就像對於原始資料類型一樣。
自訂序列化函數
標準解決方法涉及為類別建立自訂序列化和反序列化函數。這些函數以受控方式處理類別資料的讀寫。
範例函數
對於包含名為「name」的 std::string的類,序列化和反序列化函數可以實現如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | std::ostream& MyClass::serialize(std::ostream& out) const {
out << height;
out << ','
out << width;
out << ','
out << name.size();
out << ','
out << name;
return out;
}
std::istream& MyClass::deserialize(std::istream& in) {
if (in) {
int len = 0;
char comma;
in >> height;
in >> comma;
in >> width;
in >> comma;
in >> len;
in >> comma;
if (in && len) {
std::vector<char> tmp(len);
in.read(tmp.data(), len);
name.assign(tmp.data(), len);
}
}
return in;
}
|
登入後複製
重載流運算子
為了更方便使用,您可以重載類的流運算子:
1 2 3 4 5 6 7 8 9 | 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的類別:: 只需使用流運算子即可字串。
以上是如何序列化包含 std::string 的 C 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!