如何实现序列化和反序列化?如何处理对象的生命周期管理?
序列化和反序列化概念
序列化是将对象的状态转换为可以存储或传输的格式(如二进制、XML、JSON 等)的过程。反序列化则是相反的过程,将存储或传输的格式转换回对象状态。
实现方式(以简单的二进制序列化为例)
定义结构体用于存储序列化数据
假设我们有一个简单的Person类,包含姓名和年龄两个属性。
struct SerializedPerson {
char name[256];
int age;
};
序列化函数
下面是一个将Person对象序列化为SerializedPerson结构体的函数。
void serialize(const Person& p, SerializedPerson& sp) {
strcpy(sp.name, p.getName().c_str());
sp.age = p.getAge();
}
反序列化函数
用于将SerializedPerson结构体转换回Person对象。
Person deserialize(const SerializedPerson& sp) {
Person p;
p.setName(sp.name);
p.setAge(sp.age);
return p;
}
使用第三方库进行序列化(如 JSON 序列化)
以 nlohmann - json 库为例,它是一个非常流行的 C++ JSON 库。
安装和配置
可以通过将头文件包含到项目中来使用。在项目的CMakeLists.txt(如果使用 CMake 构建)中添加以下内容来包含头文件:
include(FetchContent)
FetchContent_Declare(json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.2)
FetchContent_MakeAvailable(json)
序列化示例
假设Person类有getName和getAge方法来获取姓名和年龄。
#include <nlohmann/json.hpp>
using json = nlohmann::json;
json serializePerson(const Person& p) {
json j;
j["name"] = p.getName();
j["age"] = p.getAge();
return j;
}
反序列化示例
从 JSON 对象恢复Person对象。
Person deserializePerson(const json& j) {
Person p;
p.setName(j["name"].get<std::string>());
p.setAge(j["age"].get<int>());
return p;
}
对象生命周期管理
栈对象生命周期
概念
栈对象是在函数内部定义的对象,它们的生命周期由所在的代码块决定。当程序执行进入对象定义的代码块时,对象被创建,当执行离开该代码块时,对象被销毁。
示例以下是一个函数,其中定义了一个Person栈对象。
示例
以下是一个函数,其中定义了一个Person栈对象。
void func() {
Person p("John", 30);
// 使用p对象进行一些操作
}
在这个例子中,p对象在func函数执行到Person p("John", 30);时创建,在func函数结束时销毁。
堆对象生命周期
概念
堆对象是通过new操作符在堆上分配内存创建的对象。它们的生命周期由程序员手动管理,需要使用delete操作符来释放内存。
示例下面是创建和销毁堆对象的示例。
Person* p = new Person("Alice", 25);
// 使用p对象进行一些操作
delete p;
在这个例子中,p对象通过new创建,在使用完后,必须通过delete来释放内存,否则会导致内存泄漏。
智能指针管理对象生命周期(推荐方式)
概念
智能指针是一种自动管理对象生命周期的机制。C++ 中有std::shared_ptr和std::unique_ptr等智能指针类型。
std::unique_ptr独占所指向的对象,不能复制(但可以移动),当std::unique_ptr超出作用域时,它所指向的对象会被自动销毁。
std::shared_ptr可以被多个智能指针共享,使用引用计数来管理对象的生命周期。当引用计数为 0 时,对象被销毁。
示例(std::unique_ptr)以下是使用std::unique_ptr的示例。
std::unique_ptr<Person> p = std::make_unique<Person>("Bob", 35);
// 使用p对象进行一些操作,当p超出作用域时,Person对象会自动销毁
示例(std::shared_ptr)
假设我们有两个std::shared_ptr指向同一个Person对象。
std::shared_ptr<Person> p1 = std::make_shared<Person>("Eve", 28);
std::shared_ptr<Person> p2 = p1;
// 此时Person对象的引用计数为2,当p1和p2都超出作用域或者不再引用该对象时,Person对象才会被销毁