C++ 序列化和反序列化是將對象的狀態信息轉換為可以存儲或傳輸的格式的過程,以及從這種格式恢復對象狀態的過程
序列化是將對象的狀態信息轉換為字節流或其他可存儲或傳輸的格式的過程。這通常涉及到訪問對象的私有成員變量,并將它們轉換為一種通用的數據表示形式,如二進制、XML、JSON等。
實現原理:
反序列化是從字節流或其他可存儲或傳輸的格式中恢復對象狀態的過程。這通常涉及到創建一個新的對象,并將字節流中的數據設置為對象的成員變量。
實現原理:
#include<iostream>
#include <fstream>
#include<string>
class Person {
public:
std::string name;
int age;
// 序列化函數
void serialize(std::ostream& os) const {
os.write(reinterpret_cast<const char*>(&age), sizeof(age));
std::string nameSize = std::to_string(name.size());
os.write(nameSize.c_str(), nameSize.size());
os.put('\0'); // 添加空字符作為字符串長度的終止符
os.write(name.c_str(), name.size());
}
// 反序列化函數
void deserialize(std::istream& is) {
is.read(reinterpret_cast<char*>(&age), sizeof(age));
std::string nameSize;
char ch;
while (is.get(ch) && ch != '\0') {
nameSize += ch;
}
name.resize(std::stoi(nameSize));
is.read(&name[0], name.size());
}
};
int main() {
// 創建一個 Person 對象并序列化到文件
Person person1;
person1.name = "Alice";
person1.age = 30;
std::ofstream outFile("person.bin", std::ios::binary);
person1.serialize(outFile);
outFile.close();
// 從文件反序列化 Person 對象
Person person2;
std::ifstream inFile("person.bin", std::ios::binary);
person2.deserialize(inFile);
inFile.close();
// 輸出反序列化后的 Person 對象
std::cout << "Name: "<< person2.name << ", Age: "<< person2.age<< std::endl;
return 0;
}
注意:這個示例僅用于演示基本的序列化和反序列化原理,實際應用中可能需要處理更復雜的數據結構和錯誤處理。在實際項目中,可以考慮使用成熟的序列化庫,如 Boost.Serialization、Protocol Buffers 等。