您好,登錄后才能下訂單哦!
C++ 序列化庫通常用于將對象的狀態信息轉換為可以存儲或傳輸的格式,以及從這種格式恢復對象的狀態
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cassert>
using namespace std;
Serializable
,所有需要序列化的類都應該繼承自這個基類。這個基類定義了一個純虛函數 serialize()
,用于將對象序列化為字符串。同時,還定義了一個靜態函數 deserialize()
,用于從字符串中反序列化對象。class Serializable {
public:
virtual ~Serializable() {}
virtual string serialize() const = 0;
static Serializable* deserialize(const string& data) {
// 在這里實現反序列化邏輯
}
};
Person
,繼承自 Serializable
類。在這個類中,我們需要實現 serialize()
和 deserialize()
函數。class Person : public Serializable {
public:
Person(const string& name, int age) : name_(name), age_(age) {}
string serialize() const override {
return "Person:" + to_string(age_) + ":" + name_;
}
static Person* deserialize(const string& data) {
size_t pos1 = data.find(':');
size_t pos2 = data.find(':', pos1 + 1);
assert(pos1 != string::npos && pos2 != string::npos);
string type = data.substr(0, pos1);
assert(type == "Person");
int age = stoi(data.substr(pos1 + 1, pos2 - pos1 - 1));
string name = data.substr(pos2 + 1);
return new Person(name, age);
}
private:
string name_;
int age_;
};
void saveToFile(const Serializable* obj, const string& filename) {
ofstream outfile(filename);
if (outfile.is_open()) {
outfile << obj->serialize();
outfile.close();
} else {
cerr << "Unable to open file" << endl;
}
}
Serializable* loadFromFile(const string& filename) {
ifstream infile(filename);
if (infile.is_open()) {
string data;
getline(infile, data);
infile.close();
return Serializable::deserialize(data);
} else {
cerr << "Unable to open file" << endl;
return nullptr;
}
}
int main() {
Person person("Alice", 30);
saveToFile(&person, "person.txt");
Serializable* loadedObj = loadFromFile("person.txt");
Person* loadedPerson = dynamic_cast<Person*>(loadedObj);
if (loadedPerson) {
cout << "Loaded person: " << loadedPerson->serialize() << endl;
}
delete loadedObj;
return 0;
}
這是一個簡單的 C++ 序列化庫的實現,僅用于演示目的。在實際項目中,你可能需要考慮更多的細節,例如錯誤處理、版本控制、二進制序列化等。有許多成熟的 C++ 序列化庫可供選擇,例如 Boost.Serialization、cereal 等。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。