C++序列化与反序列化实战:从文本到二进制,面试必考的数据持久化技术全解析
引言
序列化与反序列化是C++开发中的核心技能,也是大厂面试的高频考点。无论是网络传输、数据存储还是进程间通信,都离不开序列化技术。本文将系统讲解C++序列化的各种方案,帮你掌握从文本到二进制的全面序列化技术。
一、序列化基础概念
1.1 什么是序列化
| 概念 | 说明 | 示例 |
|---|---|---|
| 序列化 | 将对象状态转换为可存储/传输的格式 | 对象 → JSON字符串 |
| 反序列化 | 将存储/传输的数据还原为对象 | JSON字符串 → 对象 |
| 持久化 | 将数据保存到存储介质 | 写入文件/数据库 |
1.2 序列化的应用场景
1. 网络通信:RPC框架中的消息编解码 2. 数据存储:游戏存档、配置文件 3. 进程通信:共享内存中的数据交换 4. 缓存系统:Redis等缓存的数据格式 5. 分布式系统:节点间的数据同步二、文本格式序列化
2.1 JSON序列化
#include<iostream>#include<string>#include<map>#include<vector>#include<sstream>// 简易JSON序列化器classJsonSerializer{private:std::ostringstream ss;voidwriteString(conststd::string&key,conststd::string&value){ss<<""" << key << "":"" << value << """;}voidwriteInt(conststd::string&key,intvalue){ss<<""" << key << "":"<<value;}public:std::stringserialize(conststd::map<std::string,std::string>&data){ss.str("");ss<<"{";boolfirst=true;for(constauto&[k,v]:data){if(!first)ss<<",";writeString(k,v);first=false;}ss<<"}";returnss.str();}};// 使用nlohmann/json库(推荐)// #include <nlohmann/json.hpp>// using json = nlohmann::json;structPlayer{std::string name;intlevel;std::vector<int>scores;// 序列化为JSONstd::stringtoJson()const{std::ostringstream ss;ss<<"{"name":"" << name << "",";ss<<""level":"<<level<<",";ss<<""scores":[";for(size_t i=0;i<scores.size();i++){if(i>0)ss<<",";ss<<scores[i];}ss<<"]}";returnss.str();}// 从JSON反序列化staticPlayerfromJson(conststd::string&jsonStr){Player p;// 实际项目中应使用JSON解析库// 这里简化处理returnp;}};intmain(){Player player{"Alice",42,{100,95,88}};std::string json=player.toJson();std::cout<<"JSON: "<<json<<std::endl;return0;}2.2 XML序列化
#include<iostream>#include<string>#include<sstream>classXmlSerializer{private:std::ostringstream ss;intindent=0;voidwriteIndent(){for(inti=0;i<indent;i++)ss<<" ";}public:voidbeginTag(conststd::string&tag){writeIndent();ss<<"<"<<tag<<">"<<"\n";indent++;}voidendTag(conststd::string&tag){indent--;writeIndent();ss<<"</"<<tag<<">"<<"\n";}voidwriteElement(conststd::string&tag,conststd::string&value){writeIndent();ss<<"<"<<tag<<">"<<value<<"</"<<tag<<">"<<"\n";}std::stringgetResult()const{returnss.str();}};structConfig{std::string host;intport;std::string database;std::stringtoXml