拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++序列化与反序列化实战:从文本到二进制,面试必考的数据持久化技术全解析

C++序列化与反序列化实战:从文本到二进制,面试必考的数据持久化技术全解析

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
返回列表