Linux---序列化与反序列化

一、目的

1.序列化

简单来就就是将结构体转换成一条字符串,序列化后给存储系统或者传输通道看

2.反序列化

简单来说就是将序列化后的数据转会原来的结构体,给程序看,让程序能直接使用

3.为什么要有序列化和反序列化

主要目的是为了兼容性,在网络传输过程中只能传输二进制或字符串等,无法直接传输内存中的对象,序列化使数据变为通用,方便数据能在不同的设备、语言间进行传递,反序列化将数据还原方便进行本地操作

二、Json

在操作系统中为我们封装了很多库,方便我们使用,其中Json就是序列化和反序列化的一个库

1.头文件

cpp 复制代码
#include<jsoncpp/json/json.h>

2.序列化

①toStyledString版

cpp 复制代码
Json::Value root;
root["name"] = "张三";
root["sex"] = "男";
root["age"] = 18;
std::string s = root.toStyledString();
std::cout<<s<<std::endl;
bash 复制代码
zmz@hcss-ecs-201c:~/study/TCP/json$ g++ testjson.cc -ljsoncpp
zmz@hcss-ecs-201c:~/study/TCP/json$ ./a.out
{
        "age" : 18,
        "name" : "\u5f20\u4e09",
        "sex" : "\u7537"
}

②FastWriter版

cpp 复制代码
Json::Value root;
root["name"] = "张三";
root["sex"] = "男";
root["age"] = 18;
Json::FastWriter writer;
std::string s = writer.write(root);
std::cout<<s<<std::endl;
bash 复制代码
zmz@hcss-ecs-201c:~/study/TCP/json$ ./a.out
{"age":18,"name":"\u5f20\u4e09","sex":"\u7537"}

③StyledWriter版

bash 复制代码
Json::Value root;
root["name"] = "张三";
root["sex"] = "男";
root["age"] = 18;
Json::StyledWriter writer;
std::string s = writer.write(root);
std::cout<<s<<std::endl;
bash 复制代码
zmz@hcss-ecs-201c:~/study/TCP/json$ ./a.out
{
   "age" : 18,
   "name" : "\u5f20\u4e09",
   "sex" : "\u7537"
}

④.StreamWriterBuilder版

cpp 复制代码
Json::StreamWriterBuilder builder;
std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
std::stringstream ss;
writer->write(root, &ss);
std::string s = ss.str();

3.反序列化

cpp 复制代码
std::string json_string = "{\"name\":\"张三\", \"age\":30, \"city\":\"北京\"}";
Json::Value root;
Json::Reader reader;
bool ok = reader.parse(json_string, root);//将json_string中的数据反序列化到root

std::string name = root["name"].asString();
int age = root["age"].asInt();
std::string city = root["city"].asString();

std::cout << name <<std::endl;
std::cout <<age << std::endl;
std::cout << city << std::endl;
bash 复制代码
zmz@hcss-ecs-201c:~/study/TCP/json$ ./a.out
张三
30
北京

'\'是转义字符,告诉程序紧跟在\后边的字符需要被特殊处理,而不是按字面意思解析

防止"错误匹配

三、总结

序列化是 "数据出门的转换器",将内存数据转为可存储 / 传输的格式;反序列化是 "数据进门的还原器",将外部数据转回内存可操作的形式。二者共同支撑了数据在内存、存储、网络之间的无缝流转,是现代软件系统(尤其是分布式、前后端分离架构)的基础技术

完

相关推荐
刚入门的大一新生14 分钟前
Linux-线程互斥
java·开发语言
香芋芋圆33 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
赵小哥要冲啦1 小时前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai1 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu1 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!2 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡