当前位置: 首页 > article >正文

如何实现序列化和反序列化?如何处理对象的生命周期管理?

序列化和反序列化概念

序列化是将对象的状态转换为可以存储或传输的格式(如二进制、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对象才会被销毁


http://www.kler.cn/a/440889.html

相关文章:

  • 马克笔习惯养成法:用色彩记录你的成就
  • JS设计模式之中介者模式
  • 数字信号处理--过采样
  • 如何评估并持续优化AI呼出机器人的使用效果
  • 【大模型量化】GPTQ量化模型
  • Cookie,Seesion和Token区别及用途
  • 概率论得学习和整理29: 用EXCEL 描述二项分布
  • 餐饮喜好及健康饮食推荐小程序
  • CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞
  • 前端发展前景探讨:技术进步与职业发展机会
  • 大数据面试题--企业面试真题
  • cephFS的使用以及K8S对接cephFS
  • 构建智能化教育平台:知识中台在教育行业的创新应用
  • 路由传值的几种方式
  • 数据结构——图论基础
  • 开源的工作流编排工具—Airflow
  • 一个串口通讯的例子(ABX PENTRA 120)
  • 第三篇:HTTP 的烦恼与进化史
  • 《解析 MXNet 的 C++版本在分布式训练中的机遇与挑战》
  • 用Disk Genius备份和还原硬盘