序列化(Serialization) 是将数据结构或对象转换为一种可以存储或传输的标准化格式(如JSON、XML、二进制等)的过程,目的是在不同系统或程序间共享数据。反序列化(Deserialization)则是将这种格式重新还原为原始数据。
1. 核心概念
- 序列化:对象 → 标准化格式(如字符串、字节流)。
- 反序列化:标准化格式 → 对象。
例如:
// C++对象 → JSON字符串(序列化)
nlohmann::json obj = {{"name", "Alice"}, {"age", 30}};
std::string jsonStr = obj.dump(); // 序列化为JSON字符串
// JSON字符串 → C++对象(反序列化)
auto parsedObj = nlohmann::json::parse(jsonStr);
2. 为什么需要序列化?
- 跨平台传输:网络通信(如HTTP请求)只能传输字节流,需将数据转为JSON/XML等文本或二进制格式。
- 持久化存储:将对象保存到文件或数据库时需转为通用格式。
- 语言无关性:不同编程语言可通过JSON/Protocol Buffers等交换数据。
3. 常见序列化方式
格式 | 特点 | 示例场景 |
---|---|---|
JSON | 易读、跨语言、文本格式 | HTTP API交互(如RESTful接口) |
XML | 标签结构、冗长但灵活 | SOAP协议、配置文件 |
Protocol Buffers | 高效二进制、体积小、需预定义Schema | gRPC通信、高性能存储 |
MessagePack | 二进制JSON,比JSON更紧凑 | IoT设备数据传输 |
4. C++中的示例(以nlohmann/json库为例)
(1) 序列化
#include <nlohmann/json.hpp>
using json = nlohmann::json;
// 定义一个C++结构体
struct Person {
std::string name;
int age;
};
// 手动序列化
Person p{"Bob", 25};
json j;
j["name"] = p.name;
j["age"] = p.age;
std::string serialized = j.dump(); // {"name":"Bob","age":25}
// 自动序列化(需适配to_json函数)
void to_json(json& j, const Person& p) {
j = json{{"name", p.name}, {"age", p.age}};
}
serialized = json(p).dump(); // 直接转换
(2) 反序列化
std::string jsonStr = R"({"name":"Bob","age":25})";
auto parsedJson = json::parse(jsonStr); // JSON字符串 → json对象
Person p;
p.name = parsedJson["name"].get<std::string>();
p.age = parsedJson["age"].get<int>();
// 自动反序例化(需适配from_json函数)
void from_json(const json& j, Person& p) {
j.at("name").get_to(p.name);
j.at("age").get_to(p.age);
}
p = parsedJson.get<Person>(); // 直接转换
5. curl命令中的序列化
在之前的例子中,curl -d
后的JSON字符串是手动编写的序列化数据,而C++代码通过nlohmann::json
库自动生成合法JSON字符串。两者最终效果一致,但自动化程度不同。
总结
- 本质:将内存中的复杂数据“扁平化”为通用格式。
- 关键点:确保序列化和反序例化的规则一致(如字段名匹配)。
- 应用场景:API通信、配置文件、缓存存储等。
内容由零声教学AI助手提供,问题来源于学员提问